【发布时间】:2017-05-16 23:30:46
【问题描述】:
我正在检查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);
}
我搜索没有找到任何解释我的问题,即为什么要再次计算哈希索引,该索引用作底层数据结构的最终索引。与使用哈希作为索引相比,它有什么优势。
我知道它只是按位与,但我想知道为什么会这样。
【问题讨论】:
-
因为你需要哈希值 mod 桶的数量! [0, n-1]
-
所以这就像模数?我的意思是
h % (length -1) -
@pjj 是的,如果
length是二的幂。例如,如果length为 8,则低 3 位提供模数 (8 - 1 = 7 = 0111)。