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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗家辉 中级黑马   /  2013-4-21 12:51  /  1298 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗家辉 于 2013-4-21 14:09 编辑

在集合中,当hashCod不同,并且equals不同,才证明这是不同的对象,问题:如果有A,B个对象的hashCod相同,但是equals不同,那么hashSet是根据hashCods的值来访问的,那么它会访问是A还是B?(这样HashSet集合就会认为他们是不同的对象,可以存,假设A先存了,然后B再存,那B该存到那里去?)

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

2 个回复

正序浏览
hashcode值并不是对象在内存中存放的地址,而是为了优化内存查找,根据实际地址算出来的值。HashSet在使用add方法添加自定义对象的时候底层代码是这样的:

if(e.hash==hash&&((k=e.key)==key||key.equals(k))){
   add 方法体;
}
这句代码的意思是:先判断hashCode值是否相等,如果相等,接着判断这两个对象在内存中实际存储的地址是否相等(一般是不相等的),接着判断equals方法是否相等。
所以即使hashCode值是相等的,在内存中的实际存储位置也是不相同的。
回复 使用道具 举报
本帖最后由 先小涛 于 2013-4-21 13:07 编辑

只要hashCode不同,集合中就认是不同对象了,不必判断equals方法了。只有当hashCode方法返回值相同并且equals返回true时,才认为对象是相同的。
当hashCode返回值相同,而equals方法返回false是,他们都可以存入集合中的相同哈希值下的。
如果对象A、B的哈希值相同而equals返回false,则他们都存在同一个哈希值节点下的,这不冲突。访问时,先根据哈希值找到对象A、B,然后再根据equals方法来找。所以对象A和B在内存中的存入和取出都不冲突的。

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

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