【发布时间】:2016-09-13 12:29:00
【问题描述】:
让我们考虑HashMap,它使用单独的链接来解决哈希码冲突。
如果我有多个条目,其中 hascode 相同,冲突机制会形成所有这些条目的链表链。
现在,让我们考虑一个情况,这样的链表显示为:
(K1,V1,->) (K2,V2, ->) (K7,V7,->) (K9,V9,)
现在一个新的条目进来了,它的哈希码和K7一样,key的值也一样。它会覆盖 K7 的现有值吗?
【问题讨论】:
-
是的,因为如果哈希码相等并且您正在对冲突列表进行操作,
equals()将启动,即将检查列表中的键是否与新键相等。因此,如果您为等于 K7 的键添加新值,则该值将被替换。 - 顺便说一句,这就是为什么 hashCode() 和 equals() 应该总是一起实现/覆盖的原因。 -
取决于实现。正如@KevinEsche 所说, List 可以包含重复项,所以它可能没问题。你为什么不试试呢?
-
这个问题被标记为
hashmap。这应该是一个提示。 -
@duffymo 当然有一个具有相同哈希值的所有条目的列表。
-
在现代
HashMap中甚至还有二叉搜索树。它改善了在具有大量哈希码冲突的不良情况下的行为。
标签: java hashmap hash-collision