ทุกอ็อบเจ็กต์ 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