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.