查看Hashmap的put方法时 会有这么一段
我们知道这里调用的是Object的hashCode() 返回的是key内存地址 然后将内存地址和对内存地址进行无符号右移的新 值进行异或运算。
我们会产生一个问题 ? 为什么做这样的处理呢。
我们继续看这个返回的h传到了哪里
传递到了hash参数里面
我们知道初始的容量是16 即n经过resize()后被赋值16
p= tab[i=(n-1)&hash] 这一行 可以知道 索引i 的值为 15&hash hash就是处理过的hash值 ,我们不妨假设如果该hash值的最后4位都是0 则与运算之后的结果必定是0 即放在Entry数组的第一个位置,这样就会导致一个桶上的元素过多,降低hashmap的性能,所以我们之前的处理就是为了解决这个问题,也就是说影响结果的位数不止仅由后四位决定,通过由更多位的参与运算得到一个更加均匀分布的entry数组,有效的提高了性能。
那我们又会有一个思考 为什么要用异或运算呢? 列举分析,如果用&或 | 运算,那么有0则0或有1则1 每种可能都是75%,如果用异或 则可以均衡1和0的分布,这个应该比较容易理解。至于无符号右移16 可能是根据int的位数决定的,还需要进一步学习与思考。