为什么Java使用(hash& 0x7FFFFFFF)%tab.length来决定密钥的索引?

时间:2012-02-21 15:56:47

标签: java algorithm hashtable

从下面的链接中,我知道Java使用(hash & 0x7FFFFFFF) % tab.length来决定将{key,value}放入数组的哪个插槽。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Hashtable.java#Hashtable.put%28java.lang.Object%2Cjava.lang.Object%29

我的问题是为什么Java首先做哈希& 0x7FFFFFFF的?有什么特别的目的吗?

3 个答案:

答案 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()方法的错误实现,它返回具有低多样性的数字。