总结Java equals()和hashCode()的联系
Java equals()和hashCode()的联系
- 如果两个对象是相等的,那么它们必须有相同的哈希码。
- 如果两个对象具有相同的哈希码,他们可能相等,可能不相等。
- 如果两个对象是不同的类的实例 他们hashCode可能相等。
- 当两个对象是同一个类型的实例,他们hashCode相等,则他们相等。
约定:equals()为真那么hashCode也要相等。
结论:
一,equals()相等的两个对象,hashcode()一定相等。
二,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。 (我的理解是由于哈希码在生成的时候产生冲突造成的)。
三,反过来:hashcode()不等,一定能推出equals()也不等(因为如果equals()相等的话就和第一条矛盾了);转自这里
原则:
判断相等用equals(),判断不相等用 hashcode();
重写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”。