借鉴以下博主的文章,十分感谢!
https://blog.csdn.net/a314774167/article/details/100110216


添加一个key,到我要把它放到哪个槽位,经过一下步骤。
先调用 hashCode() 方法,得到key的哈希码。
然后 异或 (哈希码右移16位) ,其中是哈希码是32位二进制。
由于32位二进制远大于HashMap的长度,所以进行 (n-1)& hash
为什么要右移16位?
举个栗子

异或后得到的32位数字 ,高位仍然保持不变,但是低位融合高位的特征。
但是为什么要融合呢?
在进行 下一步计算时, (n-1) &hash , 由于数组的长度不会太大,那么高位的数字都被屏蔽了,简单来说,高16位变得对整体哈希没有影响。即我的最终计算的哈希值无高位特征。
异或运算能更好的保留各部分的特征,如果采用&运算计算出来的值会向0靠拢,采用|运算计算出来的值会向1靠拢
为什么长度一定是2的次幂呢?
为了让哈希后的结果更加均匀
若为奇数,减一之后,那么二进制数为1个0和一堆0,那么你的key都放在这两个地方.
性能大大降低,哈希碰撞严重,而且空间也会浪费。