为什么HashMap使用长度减去1来计算索引?

时间:2019-04-03 03:48:30

标签: java hashmap

我正在分析 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);
}

1 个答案:

答案 0 :(得分:3)

  

它用于获取更多随机数组索引吗?

  

我们可以改用length或length-2(如果存在)吗?

这只是一个数学技巧。要将哈希映射到[0, L)范围,您需要计算hash % L。除法可能会很昂贵,因此开发人员选择利用数字以二进制形式存储的优势。这仅适用于2的幂,因为只设置了一个位,所以将所有低位设置为1,再减去一个就设置为原始位。将其进行二进制与运算与计算模数具有相同的结果,比我们能处理的重要的每一位都将被丢弃。