当前位置: 首页 > 面试题库 >

为什么HashMap要求初始容量为2的幂?

云锦
2023-03-14
问题内容

看到以下内容时,我正在浏览Java的HashMap源代码

//The default initial capacity - MUST be a power of two.
static final int DEFAULT_INITIAL_CAPACITY = 16;

我的问题是为什么这个要求首先存在?我还看到,允许使用自定义功能创建HashMap的构造函数将其转换为2的幂:

int capacity = 1;
while (capacity < initialCapacity)
  capacity <<= 1;

为什么容量总是必须是2的幂?

另外,执行自动重新哈希处理后,究竟会发生什么?哈希函数也改变了吗?


问题答案:

映射必须计算出将哪个内部表索引用于任何给定键,并将任何int值(可能为负)映射到range中的值[0, table.length)。when
table.length是2的幂,可以 便宜地完成-并且是在indexFor

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

使用不同的表长度,您需要计算余数并确保其为非负数。这绝对是微优化,但可能是有效的:)

另外,执行自动重新哈希处理后,究竟会发生什么?哈希函数也改变了吗?

对我来说你的意思还不清楚。使用相同的哈希码(因为它们只是通过调用hashCode每个键来计算的),但由于表长度的变化,它们在表中的分布将有所不同。例如,当表长度为16时,哈希码5和21最终都存储在表条目5中。当表长度增加到32时,它们将位于不同的条目中。



 类似资料:
  • 问题内容: 比较JDK 1.6中的和源代码,我在HashMap中看到以下代码: 但是,在Hashtable中,我看到了以下内容: 所以我的问题是:为什么HashMap需要2的幂作为初始容量,而Hashtable选择11作为默认初始容量?我认为这与Hashtable是线程安全的并且不允许空键或值无关。 问题答案: 以下文章更详细地解决了这个问题:HashMap需要更好的hashCode()-JDK

  • 问题内容: print语句导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经具有默认值(float = 0.0f) ,为什么需要定义一个? 所以这有效 感谢大家! 问题答案: 因为它是一个局部变量。这就是为什么什么都没有分配的原因: 局部变量略有不同。编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化本地变量,请确保在尝试使用它之前为其分配一个值。访

  • 本文向大家介绍请你解释HashMap的容量为什么是2的n次幂?相关面试题,主要包含被问及请你解释HashMap的容量为什么是2的n次幂?时的应答技巧和注意事项,需要的朋友参考一下 考点:集合 负载因子默认是0.75, 2^n是为了让散列更加均匀,例如出现极端情况都散列在数组中的一个下标,那么hashmap会由O(1)复杂退化为O(n)的。

  • 问题内容: 我应该传递什么值来为N个项目创建有效的/ 基于结构的结构? 在中,有效数字为N(N已假定未来增长)。a的参数应该是什么?((int)(N * 0.75d),0.75d)?更多?减?更改负载系数有什么影响? 问题答案: 关于负载因子,我将简单引用HashMap javadoc : 通常,默认负载因子(.75)在时间和空间成本之间提供了很好的折衷。较高的值会减少空间开销,但会增加查找成本(

  • 本文向大家介绍为什么要初始化 CSS 样式相关面试题,主要包含被问及为什么要初始化 CSS 样式时的应答技巧和注意事项,需要的朋友参考一下 因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对 CSS 初始化往往会出现浏览器之间的页面显示差异。 当然,初始化样式会对 SEO 有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。 最简单的初始化方法是:*{padding: