Computer >> Máy Tính >  >> Lập trình >> Java

Hợp đồng giữa phương thức equals () và hashCode () trong Java là gì?

Mỗi đối tượng Java có hai phương thức rất quan trọng là equals () hashCode () và các phương pháp này được thiết kế để được ghi đè theo hợp đồng chung cụ thể của chúng . Một Đối tượng class là lớp cha của mọi lớp, việc triển khai mặc định của hai phương thức này đã có sẵn trong mỗi lớp. Tuy nhiên, chúng tôi có thể ghi đè các phương thức này dựa trên yêu cầu.

Phương thức hashCode ()

public int hashCode()

Phương thức này trả về một số nguyên giá trị, được gọi là giá trị mã băm của một đối tượng. Mọi Đối tượng, tại thời điểm tạo được gán với một giá trị int 32-bit, có dấu duy nhất. Giá trị này là giá trị mã băm của đối tượng đó.

Hợp đồng chung được liên kết với phương thức hashCode ()

  • Mã băm () phương thức phải trả về cùng một giá trị số nguyên cho cùng một đối tượng cho mỗi lần gọi phương thức này trừ khi giá trị được lưu trữ trong đối tượng được sửa đổi.
  • Nếu hai đối tượng bằng nhau (theo equals () ) rồi đến hashCode () phương thức sẽ trả về cùng một giá trị số nguyên cho cả hai đối tượng.
  • Tuy nhiên, không cần thiết phải có Mã băm () phương thức sẽ trả về kết quả khác biệt cho các đối tượng không bằng nhau (theo equals () phương pháp).

Phương thức equals ()

public boolean equals(Object obj)

=() phương thức của lớp Đối tượng kiểm tra tính bình đẳng của các đối tượng và theo đó nó trả về đúng hoặc sai . Việc triển khai mặc định, như được cung cấp bởi lớp Đối tượng, kiểm tra tính bình đẳng của các đối tượng trên cơ sở nếu cả hai tham chiếu đều tham chiếu đến cùng một đối tượng. Nó không kiểm tra giá trị hoặc trạng thái của các đối tượng. Nhưng chúng tôi có thể ghi đè phương thức này để cung cấp triển khai riêng nhằm so sánh trạng thái hoặc giá trị của các đối tượng.

Hợp đồng chung được liên kết với phương thức equals ()

Đối với bất kỳ biến tham chiếu không rỗng nào a, b và c

  • a.equals (a) phải luôn trả về true .
  • a.equals (b) nên trả về true nếu và chỉ khi b.equals (a) trả về true.
  • Nếu a.equals (b) trả về true b.equals (c) trả về true thì a.equals (c) nên trả về true .
  • Gọi nhiều a.equals (b) phải luôn trả về true hoặc liên tục trả về false Nếu giá trị của đối tượng không được sửa đổi cho một trong hai đối tượng.
  • a.equals (null) nên trả về false .

Vì vậy, cần phải ghi đè hashCode () phương thức của lớp Đối tượng nếu chúng ta đang ghi đè equals () phương pháp.

Ví dụ

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;
   }
}

Đầu ra

Object One and Object Two are equal
Object Three and Object Four are not equal