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
此选项按位执行,将仅将哈希值的负值更改为正值(它清除符号位)。