Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

สัญญาระหว่างวิธีเท่ากับ () และ hashCode () ใน Java คืออะไร?


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