黑马程序员技术交流社区
标题:
为什么在重写了equals()方法之后也必须重写hashCode()方法?
[打印本页]
作者:
王少雷
时间:
2013-1-3 10:21
标题:
为什么在重写了equals()方法之后也必须重写hashCode()方法?
本帖最后由 王少雷 于 2013-1-3 17:45 编辑
为什么在重写了equals()方法之后也必须重写hashCode()方法?
如题求解释原理。
作者:
而今从头越2012
时间:
2013-1-3 10:43
首先你要知道他们的关系,有两点:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false) 。
如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象
(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址。
看看下面的这段代码:
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;
}
public int hashCode() {
int h = hash;
if (h == 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;
}
作者:
刘文超
时间:
2013-1-3 10:45
本帖最后由 刘文超 于 2013-1-3 13:13 编辑
楼上解释充分。。
作者:
hanyahui
时间:
2013-1-3 10:59
上面的解释很好
作者:
何竹冬
时间:
2013-1-3 14:35
你好
哈希表结构的数据结构在存储元素时,保证元素唯一性就是靠hashCode和equals方法。
首先,判断hashCode如果要存储的元素hashcode与已存储的元素hashcode不同则视为不同元素会进行存储。
然后,如果hashcode相同继续进行equals判断地址值是否相同如果相同则视为同一个元素不会进行存储。
作者:
杨雯雯
时间:
2013-1-3 14:43
因为相同的对象必须返回的相同的哈希码。重写equals目的是为了比较两个对象的value值是否相等,hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,
导致混淆,因此,就也需要重写hashcode()
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2