- 众所周知,很多结构如Hashtable初始容量都用是11,用的素数,为了后期存数据的时候能后分布更均匀
如果用合数,重新rehash后,之前在一组的数又会重新在一起,所以不分散,所以不采用 - HashMap为什么要求容量是2的幂次方呢?
对,就用是之前在一组的数字,rehash之后会重新在一起。
定义数字为n,容量为cap,cap为2的幂次方
则一般取模运算为: n&(cap-1)
举例:
cap=16, n1 = 26
0000 0000 0001 1010
| 0000 0000 0000 1111
-------------------------------
0000 0000 0000 1010
n2 = 10
0000 0000 0000 1010
| 0000 0000 0000 1111
-------------------------------
0000 0000 0000 1010
n1、n2放在同一个table[10]中
如果cap扩容倍,则cap=32
n1=26
0000 0000 0001 1010
| 0000 0000 0001 1111
-------------------------------
0000 0000 0001 1010
n2=10
0000 0000 0000 1010
| 0000 0000 0001 1111
-------------------------------
0000 0000 0000 1010
则n1放在table[26],n2放在table[10]中
综上所述
- 在同一桶中的值table[i],在扩容一倍后会放到table[i+oldCap]中
- 求新数字放到table[i]和table[i+oldCap]中的方法为:判断n中针对oldCap的1所在的最高位是0还是1
- 如果n&oldCap为1,则放到table[i+oldCap]
- 如果n&oldCap为0,则放到table[i]