假设我们有两个对象Obj1和Obj2具有与1212相同的Hashcode.现在当我们运行“==”并且等于它时返回false.
现在我使用ValueObj1和Valueobj2作为HashMap中的值,分别使用Keys Obj1和Obj2.我相信两个值都将保存在与List相同的桶中.
我的问题是HashMap如何为Obj2选择Valueobj2而为Obj1选择ValueObj1.假设有n ..这样的对象和值.
这个键怎么样 – >值关联在内部工作,即使哈希码相同但值不同.
假设两个条件等于未被覆盖和覆盖.
HashMap / HashSet为每个桶实现一个键列表(在Map的情况下与值一起).如果多个密钥共享相同的hashCode值,则将它们放在此列表中.因此,搜索方法首先提取查询键的hashCode,然后迭代相应的列表,直到equals方法成功.在HashSet的情况下,它表示找到密钥,在HashMap的情况下,它返回元组的另一侧:值.
因此,HashMap的内存就像:
+--------+--------+--------+--------+ | 00 | 01 | 10 | 11 | +--------+--------+--------+--------+ | | | | k00/v00 _ k06/v06 _ | | k08/v08 k14/v14 | | k04/v04 _ | _
你看到的是四个桶的顶部.每个桶都有一个列表(下面的项目),用于存储密钥(k)和值(v)的元组.由于这里只有四个桶,所以哈希算法使用模4操作,因此具有值v06的密钥k06将被放置在桶06 mod 4 = 02中,因此10.如果第二密钥k14被添加14 mod 4 =因此,如图10所示,它被简单地添加到列表中.
由于值也与它一起存储,因此可以执行快速查找操作.因此,密钥与值一起存储.
您注意到,迭代(链接)列表是一项昂贵的操作.但是HashMap的观点是,人们希望使用正确术语的哈希冲突数(共享同一个桶的密钥数)非常低.通常,人们可能期望每个桶有两个或三个元素.因此,通过在恒定时间内选择正确的桶来实现性能提升,但是搜索桶需要线性时间(或者如果密钥上有完整的排序,则可以实现(平衡的)二叉树以在对数时间内搜索) .然而,最糟糕的情况是,HashMap可以实现与条目的ArrayList / LinkedList相同的性能,但是考虑到散列函数的设计得体,可能性非常低.