从下面的链接中,我知道Java使用(hash & 0x7FFFFFFF) % tab.length
来决定将{key,value}放入数组的哪个插槽。
我的问题是为什么Java首先做哈希& 0x7FFFFFFF的?有什么特别的目的吗?
答案 0 :(得分:35)
由于:
0x7FFFFFFF
是0111 1111 1111 1111 1111 1111 1111 1111:除符号位外全部为1。
(hash & 0x7FFFFFFF)
将产生正整数。
(hash & 0x7FFFFFFF) % tab.length
将位于标签长度范围内。
答案 1 :(得分:31)
因为您当然不希望将-1 % 10 == -1
索引到数组中。强制将符号位设置为0可以避免此问题。
答案 2 :(得分:4)
请注意Hashtable
或多或少过时,并被HashMap
取代。这个使用hash & (table.length-1)
来达到同样的目的。
在看到here之前,它还会进行一些变换。这是为了应对hashCode()
方法的错误实现,它返回具有低多样性的数字。