Java collison链中的哈希代码冲突处理 让我们考虑HASMAP,它使用单独的链接来解决Hash码冲突。
如果我有多个条目,其中hascode是相同的,那么冲突机制将形成所有这些条目的链表链Java collison链中的哈希代码冲突处理 让我们考虑HASMAP,它使用单独的链接来解决Hash码冲突。,java,hashmap,hash-collision,Java,Hashmap,Hash Collision,如果我有多个条目,其中hascode是相同的,那么冲突机制将形成所有这些条目的链表链 现在,让我们考虑一个例子,这样的链表呈现为: (K1,V1,->) (K2,V2, ->) (K7,V7,->) (K9,V9,) 现在一个新的条目出现了,对于它,hashcode与K7的值相同,key与K7的值相同。它会覆盖K7的现有值吗 是,它将覆盖表示K7的现有节点内的值引用 是,它将覆盖表示K7的现有节点内的值引用 hashmap函数public V putK key的定义,关于解决
现在,让我们考虑一个例子,这样的链表呈现为:
(K1,V1,->) (K2,V2, ->) (K7,V7,->) (K9,V9,)
现在一个新的条目出现了,对于它,hashcode与K7的值相同,key与K7的值相同。它会覆盖K7的现有值吗 是,它将覆盖表示K7的现有节点内的值引用
是,它将覆盖表示K7的现有节点内的值引用
hashmap函数public V putK key的定义,关于解决哈希冲突的V值 将指定的值与此映射中的指定键相关联。如果 映射之前包含键的映射,旧值为 替换 put调用的putVal的片段
hashmap函数public V putK key的定义,关于解决哈希冲突的V值 将指定的值与此映射中的指定键相关联。如果 映射之前包含键的映射,旧值为 替换 put调用的putVal的片段
是的,因为如果hashcode是相等的,并且您在冲突列表上操作,那么equals将生效,即,将检查列表中的键是否与新键相等。因此,如果为等于K7的密钥添加一个新值,则该值将被替换。-顺便说一句,这就是为什么hashCode和equals应该总是一起实现/重写的原因。这取决于实现。正如@KevinEsche所说,一个列表可以包含重复项,所以它可能是可以的。为什么不试试呢?这个问题是用hashmap标记的。这应该是一个提示。@duffymo当然有一个具有相同哈希值的所有条目的列表。在现代哈希映射中,甚至还有一个二进制搜索树。它改善了在出现大量哈希代码冲突的坏情况下的行为。是的,这是因为如果哈希代码相等,并且您在冲突列表上进行操作,那么相等将生效,即检查列表中的键是否与新键相等。因此,如果为等于K7的密钥添加一个新值,则该值将被替换。-顺便说一句,这就是为什么hashCode和equals应该总是一起实现/重写的原因。这取决于实现。正如@KevinEsche所说,一个列表可以包含重复项,所以它可能是可以的。为什么不试试呢?这个问题是用hashmap标记的。这应该是一个提示。@duffymo当然有一个具有相同哈希值的所有条目的列表。在现代哈希映射中,甚至还有一个二进制搜索树。它通过大量的hashcode冲突改善了糟糕情况下的行为;这个问题基本上归结为“如果我使用同一个键两次,hashmap是否会覆盖该值”,根据映射契约,答案是肯定的。满足契约的方法有很多,其中只有一种是替换哈希冲突链中现有节点的值引用。在询问实现细节时,问题非常清楚,但仔细考虑Hashmap的内部工作方式肯定是有趣的;这个问题基本上归结为“如果我使用同一个键两次,hashmap是否会覆盖该值”,根据映射契约,答案是肯定的。满足契约的方法有很多,其中只有一种是替换哈希冲突链中现有节点的值引用。在询问实施细节时,问题很清楚。谢谢大家的回答谢谢大家的回答
633 if (p.hash == hash &&
634 ((k = p.key) == key || (key != null && key.equals(k))))
635 e = p;
...
652 if (e != null) { // existing mapping for key
653 V oldValue = e.value;
654 if (!onlyIfAbsent || oldValue == null)
655 e.value = value;
656 afterNodeAccess(e);
657 return oldValue;
658 }