原因:当数组的长度很短时,只有低位数的hashcode值能参与运算。而让高16位参与运算可以更好的均匀散列,减少碰撞,进一步降低hash冲突的几率。并且使得高16位和低16位的信息都被保留了。
而在这里采用异或运算而不采用& ,| 运算的原因是 异或运算能更好的保留各部分的特征,如果采用&运算计算出来的值的二进制会向1靠拢,采用|运算计算出来的值的二进制会向0靠拢
然后有不少博客提到了因为int是4个字节,所以右移16位。我打开hashmap的源码,找到hash方法,按住ctrl点击方法里的hashcode,跳转到Object类,发现hashcode的数据类型是int。int为4个字节,1个字节8个比特位,就是32个比特位,所以16很可能是因为32对半的结果,也就是让高的那一半也来参与运算所以选择了16。
复习过程记录一下
参考博客:
https://blog.csdn.net/weixin_43842753/article/details/105927912