gpt4 book ai didi

java - 为什么 HashMap 在索引 (n - 1) 和哈希上插入新节点?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:32:31 25 4
gpt4 key购买 nike

为什么 HashMap 在索引上插入新的节点: tab[(n - 1) & hash]

在哪里hash = key.hashCode() ^ key.hashCode() >>> 16n = tab.length Node<K,V> 的数组.

为什么 HashMap 不这样放置节点:tab[hash] ?它只是另一个哈希函数吗,比如 hashCode() 中的大部分乘以 31?方法 ?在此先感谢您的解释!

最佳答案

哈罗德的描述很好,但我觉得没有例子是不够的。所以这是一个 -

每当创建一个新的 Hasmap 时,内部 Node[] 表的数组大小总是 2 的幂并且下面的方法保证它 -

static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

假设您提供的初始容量为 5

cap = 5
n = cap - 1 = 4 = 0 1 0 0
n |= n >>> 1; 0 1 0 0 | 0 0 1 0 = 0 1 1 0 = 6
n |= n >>> 2; 0 0 1 1 | 0 1 1 0 = 0 1 1 1 = 7
n |= n >>> 4; 0 0 0 0 | 0 1 1 1 = 0 1 1 1 = 7
n |= n >>> 8; 0 0 0 0 | 0 1 1 1 = 0 1 1 1 = 7
n |= n >>> 16; 0 0 0 0 | 0 1 1 1 = 0 1 1 1 = 7
return n + 1 7 + 1 = 8

所以表格大小是 8 = 2^3

现在,您可以将元素放入 map 的可能索引值为 0-7,因为表大小为 8。现在让我们看一下 put 方法。它按如下方式查找桶索引 -

Node<K,V> p =  tab[i = (n - 1) & hash];

其中 n 是数组大小。所以 n = 8。这等同于说

Node<K,V> p =  tab[i = hash % n];

所以我们现在需要看的是如何

hash % n == (n - 1) & hash

再举个例子。假设一个值的哈希值是 10。

hash = 10
hash % n = 10 % 8 = 2
(n - 1) & hash = 7 & 10 = 0 1 1 1 & 1 0 1 0 = 0 0 1 0 = 2

希望这对您有所帮助。 More details

PS:上面的链接转到我的博客,其中有更详细的示例解释。

关于java - 为什么 HashMap 在索引 (n - 1) 和哈希上插入新节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27230938/

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