Java 中 equals() 方法和 hashCode() 方法之間的約定是什麼?


每個 Java 物件都有兩個非常重要的方法 **equals()** 和 **hashCode()**,並且這些方法的設計要根據其特定的 **通用約定** 來重寫。**Object** 類是每個類的父類,這兩個方法的預設實現已存在於每個類中。但是,我們可以根據需要重寫這些方法。

hashCode() 方法

public int hashCode()

此方法返回一個 **整數** 值,稱為物件的雜湊碼值。每個物件在建立時都會分配一個唯一的 32 位有符號 int 值。此值是該物件的雜湊碼值。

與 hashCode() 方法相關的通用約定

  • **hashCode()** 方法應該為同一個物件每次呼叫此方法時返回相同的整數值,除非物件中儲存的值被修改。
  • 如果兩個物件相等(根據 **equals()** 方法),則 **hashCode()** 方法應該為這兩個物件返回相同的整數值。
  • 但是,**hashCode()** 方法不必為不相等的物件(根據 **equals()** 方法)返回不同的結果。

equals() 方法

public boolean equals(Object obj)

**Object** 類的 **equals()** 方法檢查物件的相等性,並相應地 **返回** **true** 或 **false**。Object 類提供的預設實現基於兩個引用是否引用同一個物件來檢查物件的相等性。它不檢查物件的值或狀態。但是,我們可以重寫此方法以提供自己的實現來比較物件的狀態或值。

與 equals() 方法相關的通用約定

對於任何非空引用變數 a、b 和 c

  • **a.equals(a)** 應始終返回 **true**。
  • **a.equals(b)** 當且僅當 **b.equals(a)** 返回 true 時才返回 **true**。
  • 如果 **a.equals(b)** 返回 **true** 且 **b.equals(c)** 返回 **true**,則 **a.equals(c)** 應返回 **true**。
  • 如果物件的任何一個值沒有被修改,則多次呼叫 **a.equals(b)** 應該始終返回 **true** 或始終返回 **false**。
  • **a.equals(null)** 應返回 **false**。

因此,如果我們重寫 **equals()** 方法,則有必要重寫 **Object** 類的 **hashCode()** 方法。

示例

線上演示

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

更新於:2020年2月6日

13K+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.