在 Java 中,
equals方法和hashCode方法之间存在一定的约定,这个约定保证了对象在被用作集合元素时的一致性和正确性。下面是为什么同一个对象的equals和hashCode必须相等的原因:
equals方法的定义:equals方法用于判断两个对象是否相等。根据 Java 规范,如果两个对象通过equals方法比较是相等的(即obj1.equals(obj2)返回true),那么它们的hashCode值必须相等。
hashCode的用途:hashCode方法返回对象的哈希码,通常用于散列数据结构,比如哈希表。在哈希表中,相同哈希码的对象被认为是相等的。因此,如果两个对象通过equals方法被认为相等,它们的hashCode值也必须相等,以确保它们可以正确地放入哈希表中。维护一致性: 如果两个对象相等,它们的
hashCode值必须相等,以维护一致性。如果在对象生命周期内,对象的内部状态发生变化,且影响了equals方法的比较结果,那么也应该相应地更新hashCode方法。违反这个约定可能导致在使用哈希表的集合中出现不一致的行为,例如无法正确查找对象或删除对象。
在实现自定义类时,通常建议同时重写
equals和hashCode方法,以确保对象的一致性和正确性。可以使用工具类如Objects中的hash方法来方便地计算hashCode,确保在hashCode的计算中涵盖了所有影响equals比较的字段。