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

Jac*_*ale 25 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.目标29%

我的问题是为什么Java首先执行hash&0x7FFFFFFF?有什么特别的目的吗?

sin*_*rix 36

因为:

  • 0x7FFFFFFF 是0111 1111 1111 1111 1111 1111 1111 1111:除符号位外的所有1.

  • (hash & 0x7FFFFFFF) 将产生正整数.

  • (hash & 0x7FFFFFFF) % tab.length 将在标签长度的范围内.


Voo*_*Voo 32

因为-1 % 10 == -1你当然不希望索引到数组.将符号位强制为0可避免此问题.