黑马程序员技术交流社区
标题:
Object类复写了equals方法后需要复写hashCode方法吗?
[打印本页]
作者:
emos-c
时间:
2013-7-15 17:20
标题:
Object类复写了equals方法后需要复写hashCode方法吗?
本帖最后由 emos-c 于 2013-7-19 16:25 编辑
今天看API,看到Object类时发现了个小问题,API上说,当复写了equals方法后,有必要将hashCode方法也复写掉,因为根据个什么协议说的当对象判断为相等时其hashCode值也应相同;再去看hashCode方法的描述时也是这么说的,当两个对象不相等时,其hashCode值也不应该相同。
我自己试了下,只复写equals方法,不复写hashCode方法,当对象判断相同时返回的hashCode不相同,感觉没问题。为什么API要求也相同呢?
还有对于hashset集合来说,当hashCode值相同时进一步通过equals判断是否相同,那如果真的按API说得复写了,那hashset的健壮性不就出问题了吗?
作者:
蚂蚁搬家
时间:
2013-7-15 17:34
在Object类中的equals方法比较的是对象的内存地址是否相同,hashCode方法返回值也是对象内存地址的hash码;
在很多类中这两个方法已经被重写过了,比如在String中,equals比较的是字符串本身的内容,而不是地址,hashCode方法返回的也是字符串内容的hash码,不是字符串地址的hash码;
在HashSet中,底层采用hash算法,它直接继承了Object类的equals方法和hashCode方法,也就是他们比较的是元素的地址,但两个元素地址不同,内容可能相同,所以我们要重写这两个方法,保证元素比较的时候是按照内容比较的,这样就不会出现重复元素了
作者:
闲人忙啊
时间:
2013-7-15 18:03
每个类都可以复写Object类中的hashCode方法,Object类中的hashCode方法就是简单地将对象在内存中的地址转换成int返回。这样,如果一个类没有复写hashCode方法,那么它的hashCode方法就是简单地返回对象在内存中的地址。在JDK中有一条就是如果两个对象是“equal”的,那么它们的hashCode方法返回的整数值必须相同,但是如果两个对象是“unequal”,那么hashCode方法的返回值不一定必须不同。正因为这个约束,我们如果复写了equals()方法,一般也要复写hashCode方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2