为啥 HashMap 的初始容量是 16(2 的幂),而 Hashtable 的初始容量是 11(素数)?

Posted

技术标签:

【中文标题】为啥 HashMap 的初始容量是 16(2 的幂),而 Hashtable 的初始容量是 11(素数)?【英文标题】:Why is the initial capacity in HashMap 16 (power of two) and the initial capacity of Hashtable 11(prime number)?为什么 HashMap 的初始容量是 16(2 的幂),而 Hashtable 的初始容量是 11(素数)? 【发布时间】:2015-01-30 19:42:36 【问题描述】:

如果您知道,请描述原因。我用谷歌搜索了它,但没有找到解释清楚的答案。

当您的hashCode 为负数时,是否使存储桶的索引为正数?

【问题讨论】:

为什么是二的幂? ***.com/questions/8352378/… @mishadoff 很好的链接,它甚至回答了旧Hashtable 中素数的原因。 我在发布这个问题之前已经阅读了这篇文章,但对解释不太了解 【参考方案1】:

对于HashMap,数组中存储Map条目的索引是这样计算的(其中h是从键的hashCode计算出来的):

static int indexFor(int h, int length) 
    return h & (length-1);

其中length 是数组的长度。

这仅在 length 是 2 的幂时有效。如果 length 不是 2 的幂,则必须将此代码更改为效率较低的 return h % length

【讨论】:

@w00te HashMap的代码可用。你只需要看看代码。 @w00te 这是您可以阅读代码的地方 - grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/… 如果我不将大小视为 2 的幂,会有什么问题?拥有二的幂有什么好处? @Eran 谢谢;我很惊讶它在 JDK 代码中的注释如此之好 :) @niiraj874u 如果您指定的初始 HashMap 容量不是 2 的幂,HashMap 会将容量更改为比您指定的容量高的最接近的 2 幂。上面的代码仅在length 是 2 的幂时有效。

以上是关于为啥 HashMap 的初始容量是 16(2 的幂),而 Hashtable 的初始容量是 11(素数)?的主要内容,如果未能解决你的问题,请参考以下文章

HashMap的初始长度为啥是16

关于HashMap容量的初始化,还有这么多学问。

为什么HashMap建议初始化容量,且容量为2的次幂?

HashMap之成员变量介绍

搞懂HashMap

HashMap实现原理