【发布时间】:2020-12-12 01:07:23
【问题描述】:
我正在尝试了解 HashMap 的实现。我发现在计算关键哈希值后,最终哈希值是使用 AND 运算符 (hashValue & (n-1)) 生成的,其中 n 是存储桶的大小。有人可以解释为什么不使用模数,这也将保证输出范围在存储桶大小内。
【问题讨论】:
我正在尝试了解 HashMap 的实现。我发现在计算关键哈希值后,最终哈希值是使用 AND 运算符 (hashValue & (n-1)) 生成的,其中 n 是存储桶的大小。有人可以解释为什么不使用模数,这也将保证输出范围在存储桶大小内。
【问题讨论】:
& 跑得更快,以换取只为 2 次方工作。 (具体来说,x & (n - 1) == x % n 如果x 是非负数且n 是2 的幂。x & (n - 1) 也可以为哈希表做你想要的——即使x 是负数,x & (n - 1) 也不是-- 不像x % n。)
这是完整且唯一的原因。
【讨论】:
%n 和 &(n-1) 是等价的。不清楚 OP 是否理解这一点。