为啥 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(素数)?的主要内容,如果未能解决你的问题,请参考以下文章