A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 emos-c 于 2013-7-19 16:25 编辑

今天看API,看到Object类时发现了个小问题,API上说,当复写了equals方法后,有必要将hashCode方法也复写掉,因为根据个什么协议说的当对象判断为相等时其hashCode值也应相同;再去看hashCode方法的描述时也是这么说的,当两个对象不相等时,其hashCode值也不应该相同。
我自己试了下,只复写equals方法,不复写hashCode方法,当对象判断相同时返回的hashCode不相同,感觉没问题。为什么API要求也相同呢?
还有对于hashset集合来说,当hashCode值相同时进一步通过equals判断是否相同,那如果真的按API说得复写了,那hashset的健壮性不就出问题了吗?

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
在Object类中的equals方法比较的是对象的内存地址是否相同,hashCode方法返回值也是对象内存地址的hash码;
在很多类中这两个方法已经被重写过了,比如在String中,equals比较的是字符串本身的内容,而不是地址,hashCode方法返回的也是字符串内容的hash码,不是字符串地址的hash码;
在HashSet中,底层采用hash算法,它直接继承了Object类的equals方法和hashCode方法,也就是他们比较的是元素的地址,但两个元素地址不同,内容可能相同,所以我们要重写这两个方法,保证元素比较的时候是按照内容比较的,这样就不会出现重复元素了

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
每个类都可以复写Object类中的hashCode方法,Object类中的hashCode方法就是简单地将对象在内存中的地址转换成int返回。这样,如果一个类没有复写hashCode方法,那么它的hashCode方法就是简单地返回对象在内存中的地址。在JDK中有一条就是如果两个对象是“equal”的,那么它们的hashCode方法返回的整数值必须相同,但是如果两个对象是“unequal”,那么hashCode方法的返回值不一定必须不同。正因为这个约束,我们如果复写了equals()方法,一般也要复写hashCode方法。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马