Java对于eqauls方法和hashCode方法有如下规定:
1、如果两个对象相同即equals()返回 true 时,那么它们的hashCode值一定要相同;(为什么?以set集合为例,它用equals()方法判断两个对象是否相等,若两个对象相等,但其hashcode不同,是使这个两个对象都能添加成功,与set规则冲突)
2、如果两个对象的hashCode相同,它们并不一定相同。
如果重写了一个类的equals() 方法,使两个对象的在逻辑上相等,则此时需要重写hashcode 方法,因为继承父类Object 的hashcode() 方法返回的是一个虚拟内存地址,此时两个对象的hashcode 值时不同的,所以需要重写 hashcode()方法,以能够满足规定1。
如:String 类的equals() 方法时 重写后是根据值来进行比较的,若值相同则返回 true, hashcode() 重写如下:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}