我正在分析 jdk7 中 HashMap
的源代码,发现当我们调用put()
方法来添加元素时,它会将使用indexFor()
计算索引并将元素存储在数组中,该方法如下所示。
现在我想知道为什么它使用 h & (length-1)
来获取索引?它用于获取更多随机数组索引吗?我们可以改用 length
或 length-2
(如果存在)吗?
有人可以帮助我理解这一点吗?提前致谢!
static int indexFor(int h, int length) {
// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
return h & (length-1);
}
答案 0 :(得分:3)
它用于获取更多随机数组索引吗?
否
我们可以改用length或length-2(如果存在)吗?
否
这只是一个数学技巧。要将哈希映射到[0, L)
范围,您需要计算hash % L
。除法可能会很昂贵,因此开发人员选择利用数字以二进制形式存储的优势。这仅适用于2的幂,因为只设置了一个位,所以将所有低位设置为1,再减去一个就设置为原始位。将其进行二进制与运算与计算模数具有相同的结果,比我们能处理的重要的每一位都将被丢弃。