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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李然 中级黑马   /  2013-12-14 23:16  /  1795 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

想请教一下各位大神,有的书上说我们在hashset中存自定义的对象时,为了保证hashset中的元素的不一致性,要在自定义类中对object类中的hashcode()和equals()方法进行重写。我想问的是如果我们根据自定义对象中的具体数据重写完后,已经保证了每一个对象对应的内存地址都不一样,那么还有必要重写equals()吗?
是不是重写hashcode()方法就足够了?
请各位大神指点一下!!!

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

3 个回复

正序浏览
我觉得你的意思应该是觉得既然hash一样既地址值一样了,那么他们就是指向的同一个空间喽,内容肯定是一样的。 我刚开始也有这样的困惑。
但是hashset是在判断hash值一样之后再去判断一次存储的内容是否一致。那么只有一种解释就是,hash值并不代表绝对内存地址,而是根据地址生成的一个值,所以这个值一样里面的内容并不一定一样。

评分

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

查看全部评分

回复 使用道具 举报

HashSet集合的特点是元素无序和不重复 。

首先,HashSet的底层数据结构是哈希表。哈希表就是存储一系列哈希值的表,而哈希值是由对象的hashCode()方法生成的。

确保元素唯一性的两个方法,hashCode()和equals()方法。

当调用add()方法向集合中存入对象的时候,先比较此对象与原有对象的哈希值有没有一样的,如果都不一样就直接存入;如果有与之相同的哈希值,则要继续比较这两个对象是否为同一个对象,此时就要调用对象的equals()方法了。

总之,只有HashCode的至相同时,才会调用equals()方法。

在判断元素是否存在和删除一个元素的时候,也是这个过程。

评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 有点答非所问的感觉

查看全部评分

回复 使用道具 举报
FFF 金牌黑马 2013-12-15 01:09:37
沙发
hashcode一样,但equals可能不一样,那么对象也不一样。(hashCode一样equals不一样的可能性极小,但不是没有。)当你只判断hashCode的时候,小数据是没有问题。但如果是大数据,偶然的东西,就会变成必然。然后,找BUG的时候你会死得很有节奏~~所以,equals还是写上的比较好。
我们写程序,要尽最大可能考虑到所有的情况。

Ps:
equals一样,hsahCode必然是一样的!

纯手打~~~

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1 淡定

查看全部评分

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