深入学习hashCode 和equals()方法的关系
在java中,每个对象都可以调用hashCode()方法得到自己的哈希值(一串数值),就像人的指纹一样。但是在java中对象并不能做到像人一样,指纹都是唯一的。
在判断两个对象之间是否想等时,我们通常使用hashCode()方法和equals()方法。
- 如果两个对象之间的hashCode不相同,那么这两个对象肯定是不相等的对象;
- 如果两个对象的hashCode相同,那么这两个对象可能是相等,也可能不相等;
- 如果两个对象相等,那么这两个对象的hashCode 一定相等;
在比较两个对象是否想等时,一般会先调用hashCode方法,如果hashCode相同,再调用equals()方法进行比较,因为hashCode()
实现比较轻(一串数值),equals()方法比较重,不同对象的equals()可能不相同。
// Integer 的equals()
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
// String 的equals()
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
由上可知,不同对象的equals()方法不相同。
如上,两个对象只重写了equals()方法,没重写hashCode()方法,所以这两个对象是不相等的。而HashMap的get()方法,先通过对比hashCode,再对比equals()方法判断是否已存在对象的key,new User(“zhangsan”) 作为一个新的对象,所以hashMap中不存在以new User(“zhangsan”) 为key的值
重写hashCode 后如下:可见重写了equals()方法一定要重写hashCode()方法