Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java collison链中的哈希代码冲突处理 让我们考虑HASMAP,它使用单独的链接来解决Hash码冲突。_Java_Hashmap_Hash Collision - Fatal编程技术网

Java collison链中的哈希代码冲突处理 让我们考虑HASMAP,它使用单独的链接来解决Hash码冲突。

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的定义,关于解决

如果我有多个条目,其中hascode是相同的,那么冲突机制将形成所有这些条目的链表链

现在,让我们考虑一个例子,这样的链表呈现为:

(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             }