为什么在HashMap中计算哈希码的索引

时间:2017-05-16 23:30:46

标签: java hash hashmap

我正在检查HashMap的实现,并且在put我看到在计算哈希之后,计算哈希的索引,就像这个int i = indexFor(hash, table.length);一样,并且它被用作索引底层地图。

/**
 * Returns index for hash code h.
 */
static int indexFor(int h, int length) {
    return h & (length-1);
}

我搜索了没有找到我的问题的任何解释,为什么再次计算哈希索引,用作底层数据结构的最终索引。与使用哈希作为索引相比,它有什么优势。

我知道这只是按位而已,但我想知道为什么会这样做。

1 个答案:

答案 0 :(得分:5)

对象的哈希码可以是任何int值,介于-2 ^ 31和2 ^ 31-1之间。哈希表使用的基础数组不会具有相同的范围(没有负数,对于一个,可能不是那么大),因此必须有一些操作将哈希代码从其原始范围转换为0和0之间的一个。数组的长度。

因为HashMap始终使用大小为2的幂(例如16,32,64等),使用&是一种将哈希码映射到标记的有效方法,因为它只是剥离其他位。其他哈希表实现可能会使用模数来实现类似的效果,如果它们不将数组大小限制为2的幂。

另见https://en.wikipedia.org/wiki/Hash_table#Collision_resolution