Java重写hashCode()方法有几个原则:
1、如果两个对象使用equals()方法比较,返回true(即相等),那么两个比较对象返回的hashCode()必须相等。((objB));
(() == ());
如果(objB)为true,那么== ()也一定为true。
2、多次调用同一对象的hashCode()方法,如果equals()方法里所使用的变量没有任何变化,那么必须返回相同的hashCode值。User user = new User();
(10);
int hash1 = ();
int hash2 = ();
(11);
int hash3 = ();
假如User的equals()方法使用了age计算,hash1和hash2,age的值同为10,没被修改,那么hash1和hash2相等。计算hash3前,age值修改为11,那么hash3的值可以与之前的hash1和hash2不等,也可以相等。
3、返回hashCode相等的对象,不一定equals()相等,也即是不同对象出现hash值碰撞。注意,一个好的hash算法应该让不同的对象有不同的hash值,这样会提高散列的性能。
重写方法
一般情况下,如果我们重写了类的equals()方法,最好也重写hashCode()方法,并且equals()方法里用到的成员变量也需要在hashCode()里做计算。
hashCode()返回的值对于使用散列存储的结构(如HashTable,HashSet,HashMap)的性能很重要,重写hashCode()方法最好是让不同的对象(即使用equals()不等),返回不同的hashCode的值。
Effective Java的作者推荐使用基于17和31的散列码的算法,如@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != ()) return false;
User user = (User) o;
if (!()) return false;
return age == ;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + ();
result = 31 * result + age;
return result;
}
Java 7新增的Objects类提供了计算hashCode的通用方法,可以很简洁实现hashCode@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != ()) return false;
User user = (User) o;
return (name, ) &&
(age, );
}
@Override
public int hashCode() {
return (name,age);
}