当我浏览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
值(可以是负数)到范围内的值[0, table.length)
. When table.length
是二的幂,可以做到really便宜 - 并且是,在indexFor
:
static int indexFor(int h, int length) {
return h & (length-1);
}
对于不同的表长度,您需要计算余数并确保它是非负的。这绝对是一种微观优化,但可能是有效的:)
另外,当执行自动重新哈希时,到底会发生什么?哈希函数也改变了吗?
我不太清楚你的意思。使用相同的哈希码(因为它们只是通过调用计算得出hashCode
在每个键上),但由于表长度的变化,它们在表中的分布会有所不同。例如,当表长度为16时,哈希码5和21最终都存储在表条目5中。当表长度增加到32时,它们将位于不同的条目中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)