equals方法
没有重新equals方法时默认调用的是Object中的equals方法:
public boolean equals(Object obj) {
return (this == obj);
}
可以看到,它直接通过“==”来比较两个对象,也就是判断两个对象是否是同一个对象。
hashCode方法
- 程序运行期间,同一个对象多次调用hashCode方法的返回的int值必须相同。
- equals方法结果为true的两个对象必须具有相等的哈希码。
- 如果两个对象的hashCode相同,它们的equals方法并不一定返回true。
equals方法和hashCode方法的关系
其实就是上面的后两条:
-
两个不相同对象的hashCode方法可能返回相同的int值,但是hashCode返回值相同的两个对象不一定通过equals方法比较返回true。
从数学的角度来说:equals比较两个对象相等是hashCode相等的充分不必要条件 -
equals方法比较结果相等的两个对象,它们的hashCode方法返回值一定相同
-
为什么重写equals一定要重写hashcode?
原因:
- 假如只重写equals而不重写hashcode,那么此时调用的就是Object默认的hashcode方法,由于默认的hashcode方法是根据对象的内存地址经哈希算法得来的,显然此时obj1 != obj2,故两者的hashcode不一定相等。
然而重写了equals,且obj1.equals(obj2)返回true,根据上面hashcode的第二条性质,两个对象相等其哈希值一定相等
,所以矛盾就产生了,因此重写equals一定要重写hashcode.