gpt4 book ai didi

java - HashMap 条目冲突

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:44:20 27 4
gpt4 key购买 nike

我正在尝试这段代码

Map headers=new HashMap();
headers.put("X-Capillary-Relay","abcd");
headers.put("Message-ID","abcd");

现在,当我为任一键执行 get 时,它工作正常。但是,我在 Eclipse 调试器上看到了一个奇怪的现象。当我调试并进入变量内部并首先检查 table 条目时,我看到了这个

->table
--->[4]
------>key:X-Capillary-Relay
...........

但是在调试完第二行之后我得到了

->table
--->[4]
------>key:Message-ID
...........

它不会创建新条目,而是覆盖现有 key 。对于任何其他 key ,不会发生这种覆盖。 map 的大小如 2 所示,get 对两个键都有效。那么 eclipse 调试器中出现这种差异的原因是什么。这是 eclipse 问题吗?或者哈希问题。 2 个 key 的哈希码不同。

最佳答案

key 的 hashCode 未按原样使用。

它应用了两个转换(至少基于 Java 6 代码):

static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}

/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
return h & (length-1);
}

由于长度是 HashMap 的初始容量(默认为 16),所以两个键的长度都是 4:

System.out.println (hash("X-Capillary-Relay".hashCode ())&(16-1));
System.out.println (hash("Message-ID".hashCode ())&(16-1));

因此,这两个条目都存储在映射的同一存储桶中的链表中(table 数组的索引 4,如您在调试器中所见)。调试器只显示其中一个的事实并不意味着另一个被覆盖了。这意味着你看到的是链表第一个Entry的key,每一个新的Entry都被添加到链表的头部。

关于java - HashMap 条目冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30615649/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com