ทุกอ็อบเจ็กต์ Java มีสองวิธีที่สำคัญมาก equals() และ hashCode() และวิธีการเหล่านี้ได้รับการออกแบบให้ถูกแทนที่ตามสัญญาทั่วไป . วัตถุ คลาสเป็นคลาสหลักของทุกคลาส การใช้งานเริ่มต้นของสองเมธอดนี้มีอยู่แล้วในแต่ละคลาส อย่างไรก็ตาม เราสามารถแทนที่วิธีการเหล่านี้ได้ตามความต้องการ
วิธี hashCode()
public int hashCode()
เมธอดนี้คืนค่า จำนวนเต็ม ค่าซึ่งเรียกว่าค่ารหัสแฮชของวัตถุ ทุกอ็อบเจ็กต์ ณ เวลาที่สร้างกำหนดด้วยค่า int ที่ลงนามแบบ 32 บิตที่ไม่ซ้ำกัน ค่านี้คือค่าแฮชโค้ดของออบเจกต์นั้น
สัญญาทั่วไปที่เกี่ยวข้องกับวิธี hashCode()
- The hashCode() เมธอดควรคืนค่าจำนวนเต็มเดียวกันสำหรับอ็อบเจ็กต์เดียวกันสำหรับการเรียกเมธอดนี้แต่ละครั้ง เว้นแต่ว่าค่าที่เก็บไว้ในอ็อบเจ็กต์จะถูกแก้ไข
- ถ้าวัตถุสองชิ้นเท่ากัน (ตาม equals() วิธีการ) จากนั้น hashCode() วิธีการควรคืนค่าจำนวนเต็มเดียวกันสำหรับวัตถุทั้งสอง
- แต่ไม่จำเป็นว่า hashCode() method จะส่งคืนผลลัพธ์ที่ชัดเจนสำหรับวัตถุที่ไม่เท่ากัน (ตาม equals() วิธีการ)
เท่ากับ () วิธีการ
public boolean equals(Object obj)
เท่ากับ() method ของ Object class ตรวจสอบความเท่าเทียมกันของอ็อบเจกต์แล้ว ส่งคืน จริง หรือ เท็จ . การใช้งานเริ่มต้นตามที่คลาสอ็อบเจ็กต์ให้ไว้จะตรวจสอบความเท่าเทียมกันของออบเจกต์บนพื้นฐานหากการอ้างอิงทั้งสองอ้างถึงอ็อบเจ็กต์เดียวกัน ไม่ตรวจสอบค่าหรือสถานะของวัตถุ แต่เราสามารถลบล้างวิธีการนี้เพื่อจัดเตรียมการนำไปใช้เพื่อเปรียบเทียบสถานะหรือค่าของวัตถุได้
สัญญาทั่วไปที่เกี่ยวข้องกับวิธีเท่ากับ ()
สำหรับตัวแปรอ้างอิงที่ไม่ใช่ค่าว่าง a, b และ c
- a.equals(a) ควรส่งคืน จริง . เสมอ .
- a.equals(b) ควรกลับ จริง ก็ต่อเมื่อ b.equals(a) คืนค่าเป็นจริง
- ถ้า a.equals(b) คืนค่า จริง และ b.equals(c) คืนค่า จริง แล้ว a.equals(c) ควรกลับ จริง .
- การโทรหลายครั้งของ a.equals(b) ควรคืนค่า จริง . อย่างสม่ำเสมอ หรือคืนค่า เท็จ . อย่างสม่ำเสมอ หากค่าของวัตถุไม่ถูกแก้ไขสำหรับวัตถุใดวัตถุหนึ่ง
- a.equals(null) ควรส่งคืน เท็จ .
ดังนั้นจึงจำเป็นต้องแทนที่ hashCode() เมธอดของ Object class หากเราเอาชนะ equals() วิธีการ
ตัวอย่าง
public class MainClass {
public static void main(String[] args) {
MainClass mainClass = new MainClass();
TestClass obj1 = new TestClass(1);
TestClass obj2 = new TestClass(1);
mainClass.test1(obj1, obj2);
TestClass obj3 = new TestClass(1);
TestClass obj4 = new TestClass(2);
mainClass.test2(obj3, obj4);
}
public void test1(TestClass obj1, TestClass obj2) {
if (obj1.equals(obj2)) {
System.out.println("Object One and Object Two are equal");
}
else {
System.out.println("Object One and Object Two are not equal");
}
}
public void test2(TestClass obj3, TestClass obj4) {
if (obj3.equals(obj4)) {
System.out.println("Object Three and Object Four are equal");
}
else {
System.out.println("Object Three and Object Four are not equal");
}
}
}
class TestClass {
private int val;
TestClass(int val) {
this.val = val;
}
public int getValue() {
return val;
}
@Override
public boolean equals(Object o) {
// null check
if (o == null) {
return false;
}
// this instance check
if (this == o) {
return true;
}
// instanceof Check and actual value check
if ((o instanceof TestClass) && (((TestClass) o).getValue() == this.val)) {
return true;
}
else {
return false;
}
}
@Override
public int hashCode() {
int result = 0;
result = (int) (val / 11);
return result;
}
} ผลลัพธ์
Object One and Object Two are equal Object Three and Object Four are not equal