黑马程序员技术交流社区

标题: hashCods的问题 [打印本页]

作者: 罗家辉    时间: 2013-4-21 12:51
标题: hashCods的问题
本帖最后由 罗家辉 于 2013-4-21 14:09 编辑

在集合中,当hashCod不同,并且equals不同,才证明这是不同的对象,问题:如果有A,B个对象的hashCod相同,但是equals不同,那么hashSet是根据hashCods的值来访问的,那么它会访问是A还是B?(这样HashSet集合就会认为他们是不同的对象,可以存,假设A先存了,然后B再存,那B该存到那里去?)
作者: 先小涛    时间: 2013-4-21 13:00
本帖最后由 先小涛 于 2013-4-21 13:07 编辑

只要hashCode不同,集合中就认是不同对象了,不必判断equals方法了。只有当hashCode方法返回值相同并且equals返回true时,才认为对象是相同的。
当hashCode返回值相同,而equals方法返回false是,他们都可以存入集合中的相同哈希值下的。
如果对象A、B的哈希值相同而equals返回false,则他们都存在同一个哈希值节点下的,这不冲突。访问时,先根据哈希值找到对象A、B,然后再根据equals方法来找。所以对象A和B在内存中的存入和取出都不冲突的。
作者: 晓风妮子    时间: 2013-4-21 13:52
hashcode值并不是对象在内存中存放的地址,而是为了优化内存查找,根据实际地址算出来的值。HashSet在使用add方法添加自定义对象的时候底层代码是这样的:

if(e.hash==hash&&((k=e.key)==key||key.equals(k))){
   add 方法体;
}
这句代码的意思是:先判断hashCode值是否相等,如果相等,接着判断这两个对象在内存中实际存储的地址是否相等(一般是不相等的),接着判断equals方法是否相等。
所以即使hashCode值是相等的,在内存中的实际存储位置也是不相同的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2