我一直在研究哈希表源代码。并发现哈希如何发生:
int index = (hash & 0x7FFFFFFF) % tab.length;
我不明白为什么在这里使用按位AND?
如果将0x7FFFFFFF转换为二进制,则得到= 111 1111 1111 1111 1111 1111 11111111
据我所知,如果第一位和第二位= 1,则将给出1因此,如果我们得到一些对象哈希码,例如2314539
,将其转换为二进制并执行操作,我们实际上得到的是相同的数字:
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
您可以看到此操作没有进行任何更改。那这里有什么意义?
让我们从%
的含义开始。根据JLS 15.17.3:
对于二进制二进制数提升后的整数(第5.6.2节)的操作数的余数运算会产生结果值,使得
(a/b)*b+(a%b)
等于a
。根据该规则,余数运算的结果仅在股息为负时才可以是负的,而在股息为正时才可以是正的。此外,结果的大小始终小于除数的大小。
假设索引被计算为index = hash % tab.length
。如果是这样,则hash
的负值将导致index
的负值。
但是我们将使用index
下标tab
,因此它必须位于0
和tab.length
之间。
因此,实际计算通过屏蔽符号位将hash
映射为非负数。