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

2022-09-01 08:05:36

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

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?有什么特别的目的吗?


答案 1

因为:

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

  • (hash & 0x7FFFFFFF)将生成正整数。

  • (hash & 0x7FFFFFFF) % tab.length将在选项卡长度的范围内。


答案 2

因为您肯定不希望将其索引到数组中。强制符号位为 0 可避免此问题。-1 % 10 == -1