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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘郑瑞 中级黑马   /  2013-1-20 11:55  /  1315 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么hashset中hashcode相同了还会调用equals方法呢?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

5 个回复

倒序浏览
先通过HashCode判断,HashCode没被复写的时候,是通过内存地址来推算的,所以必然不相等。所以要复写HashCode方法。在通过equals方法判断内容是否相等。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李光耀 于 2013-1-20 14:17 编辑

因为Set集合中元素不可以重复的,
如果只通过hashCode算哈希值,例如 ”ab“   ”ba“ 哈希值最后算出相同了, 会认定他们是重复的,后存入的元素不会存入。
但是他们内容根本不相同。
当哈希值相同时,需要再判断一次。

这时候需要equals比较他们内容是否相同,这样双重判断保证该集合的元素唯一性。

哈希值不相同,存入。
哈希值相同,内容相同,不存。
哈希值相同 内容不相同,存入。

{:soso__16328543767435193123_3:}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
楼上正解
回复 使用道具 举报
HashSet :底层数据结构是哈希表,存入其中的元素不能重复;线程是不同步。
HashSet是通过元素的两个方法,hashcode和equals来保证元素的唯一性。
如果元素的hashcode值相同,才会判断equals是否为true;
如果元素的hashcode值不同,不会调用equals()方法;
重点:HashSet对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals()方法。
因此如果使用的对象存入的集合类型是HashSet集合,一般都建议重写 hashCode()和equals()方法



评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
HashSet不可以存储相同的元素,equals方法是用来判断该元素是否相同,如果不同才可以将元素添加进来,否则视为相同元素,不添加。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

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