阿里巴巴Java开发手册手册:
-
只要重写 equals,就必须重写 hashCode。 -
因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。 -
如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals。
equals()的设计原则
-
对称性:如果x.equals(y)返回是true,那么y.equals(x)也应该返回是true。 -
反射性:x.equals(x)必须返回是true。 -
类推性:如果x.equals(y)返回是true,而且y.equals(z)返回是true,那么z.equals(x)也应该返回是true。 -
一致性:如果x.equals(y)返回是true,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是true。 -
非空性:x.equals(null),永远返回是false;x.equals(和x不同类型的对象)永远返回是false。
hashCode()的设计原则
-
在一个Java应用的执行期间,如果一个对象提供给equals做比较的信息没有被修改的话,该对象多次调用hashCode()方法,该方法必须始终如一返回同一个integer。 -
如果两个对象根据equals(Object)方法是相等的,那么调用二者各自的hashCode()方法必须产生同一个integer结果。 -
并不要求根据equals(java.lang.Object)方法不相等的两个对象,调用二者各自的hashCode()方法必须产生不同的integer结果。然而,程序员应该意识到对于不同的对象产生不同的integer结果,有可能会提高hash table的性能。
参考: |