黑马程序员技术交流社区
标题:
关于hashcode() 和 equals() 方法
[打印本页]
作者:
宋国涛
时间:
2011-9-23 00:38
标题:
关于hashcode() 和 equals() 方法
(1)通常来说,一个类的两个实例对象用equals方法比较的结果相等的时候,他们的哈希码也必须相等,但反之则不成立,即equals方法比较结果不相等的对象可以有相同的哈希码,或者说哈希码相同的两个对象的equals方法比较的结果可以不等,例如,字符串BB和Aa的equals方法比较的结果肯定不相等,但是他们的hashCode方法返回值相等。
(2)当一个对象被存储到HashSet集合中以后,就不能修改这个对象中的某些参与计算哈希码的字段了,否则,对象修改以后的哈希码与最初存储金集合的哈希码就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从Hash集合中单独的删除当前的对象,从而造成内存泄漏。
以上的两个结论,第二个理解了,第一个还有些疑惑,希望大家解惑。。。
作者:
匿名
时间:
2011-9-23 09:35
Hashcode() 和equals(0都是判断对象否相等的。但是他们是有区别的。
equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。比如有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别相等,那么就说这2个对象是相等的。
hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,还是刚刚的例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。
作者:
王清云
时间:
2011-9-23 12:47
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
这是String的equals方法的源码,是一个字符一个字符的比较,这样比较BB和Aa当然是不相等的,但是String的hashcode方法是这样的:
public int hashCode() {
int h = hash;
if (h == 0 && count > 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
BB的hashcode是:66*31+66,Aa的hashcode是65*31+97,刚好是相等的,所以返回的hashcode是相等的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2