本文系转载,原文地址:hashCode方法及equals方法的规范
在Java中,hashCode方法和equals方法都是java.lang.Object类的方法,在 The Java Language Specification, Java SE 8 Edition 中定义如下:
The method
equals
defines a notion of object equality, which is based on value, not reference, comparison.The method
hashCode
is very useful, together with the method equals , inhashtables
such asjava.util.HashMap
.
简而言之,equals法是判断两个对象是否等价的方法,而hashCode则是为散列数据结构服务的计算散列值的方法。
equals方法
-
自反性(Reflexive):一个对象与自身相等,即x=x。对任何非空对象x, x.equals(x)必定为true。
-
对称性(Symmetric):对象之间的等价关系是可交换的,即a=b⇔b=a。对任何非空对象x、y, x.equals(y)为true,当且仅当y.equals(x)为true。
-
传递性(Transitive):(a=b)∧(b=c)⇒(a=c)。对任何非空对象x、y、z, 若x.equals(y)为true且y.equals(z)为true,则x.equals(z)为true。
除了遵循这三原则之外,还要遵循:
-
一致性(Consistent):对任何非空对象x、y,只要所比较的信息未变,则连续调用x.equals(y)总是得到一致的结果。这要求了equals所依赖的值必须是可靠的。
-
对任何非空对象x, x.equals(null)必定为false。
hashCode方法
如果重写了equals方法,则一定要重写hashCode方法。
重写hashCode方法的原则如下:
-
在程序执行期间,只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。
-
如果两个对象通过equals方法比较得到的结果是相等的,那么对这两个对象进行hashCode得到的值应该相同。
-
两个不同的对象,hashCode的结果可能是相同的,这就是哈希表中的冲突。为了保证哈希表的效率,哈希算法应尽可能的避免冲突。