- 在看HashMap源码的时候,用hash码判断哈希桶的位置,用的是&位运算符取余的操作 i = (n - 1) & hash,这里的n是哈希桶的个数,i是桶的位置。
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
- 首先用&取余是有限制条件的:
除数必须是2的n次幂才行
所以java规定了默认初始容量必须是2的幂次。
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
对于一个数k要除以2的n次方,也就是相当于把k向右移n位,而被移出去的n位即正好是我们要求的余数。
2的二进制减1是 0001
4的二进制减1是 0011
8的二进制减1是 0111
16的二进制减1是 1111
...
现在就明确了 用 k&(2的n次幂-1) 可以实现取余操作
11%4=3
=11 & (4-1)
=1011 & (0100 - 1)//用二进制表示
=1011 & 0011
=0011
=3
11 除以 4
=11 >> 2
=1011 >> 2
=10 | 11
=2 余 3