java哈希表中的哈希

java哈希表中的哈希,java,hash,hashtable,Java,Hash,Hashtable,我一直在挖掘哈希表的源代码。 并发现散列是如何发生的: int index = (hash & 0x7FFFFFFF) % tab.length; 我不明白为什么在这里按位和使用 如果我们将0x7FFFFFFF转换为二进制,则得到=1111111111111111111111111111111111111111111111111111111111‬ 如我所知,如果第一个数字和第二个数字分别为1 因此,如果我们得到一些对象hashcode,例如2314539将其转换为二进制并执行操作(&

我一直在挖掘哈希表的源代码。 并发现散列是如何发生的:

int index = (hash & 0x7FFFFFFF) % tab.length;
我不明白为什么在这里按位和使用

如果我们将0x7FFFFFFF转换为二进制,则得到=1111111111111111111111111111111111111111111111111111111111‬

如我所知,如果第一个数字和第二个数字分别为1 因此,如果我们得到一些对象hashcode,例如
2314539
将其转换为二进制并执行操作(&O),我们实际上得到了相同的数字:

2314539=10 0011 0101 0001 0010 1011

10 0011 0101 0001 0010 1011
&
 11 1111 1111 1111 1111 1111‬
=
 10 0011 0101 0001 0010 1011
10 0011 0101 0001 0010 1011=2314539


如您所见,此操作不会进行任何更改。那么这里有什么意义呢?

让我们从Java中余数(
%
)的含义开始。根据:

二进制数字提升(§5.6.2)后的整数操作数的余数运算产生一个结果值,使得
(a/b)*b+(a%b)
等于
a

根据这条规则,余数运算的结果只能在红利为负时为负,并且只能在红利为正时为正。此外,结果的大小总是小于除数的大小

假设
索引
计算为
index=hash%tab.length
。如果是这样,则
散列
的负值(红利)将导致
索引
的负值

但是我们将使用
索引
来下标
选项卡
,因此它必须位于
0
tab.length
之间

相反,实际计算首先通过屏蔽符号位将
散列
映射到非负数。然后执行余数操作

这有什么意义

  • 您的示例是一个正的
    哈希值。
    &
    确实会对负
    散列值产生影响
  • 关键是要避免一个负的
    散列
    值给出一个负的
    索引
    值,这将导致一个
    ArrayIndexOutOfBoundsException

  • 此选项按位执行,将仅将
    哈希值的负值更改为正值(它清除符号位)。