【问题标题】: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 为负数时,是否使存储桶的索引为正数?

【问题讨论】:

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

标签: java collections hashmap 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 的幂时有效。
猜你喜欢
  • 2012-01-11
  • 2014-08-14
  • 2019-11-08
  • 1970-01-01
  • 2011-05-10
  • 2012-10-31
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多