#HashMap
在HashMap中需要确定Node或TreeNode节点应该连接在那个Table[index]之后
判断代码:tab[(n - 1) & hash] 此处的hash= key.hashCode() ^ (h >>> 16)
此处的n为table数组的长度
为什么要与(n-1)&
要保证所有元素都能落在table数组的范围内(不能数组长度只有16却要放到17);
因为要求了table数组长度必须是2的幂次方,故(n-1)刚好等于table.length;
使用(n-1)进行与运算,刚好取得的是hashCode的低(n-1)位既可以落在数组里
为什么hashCode要右移16位(hashCode>>>16)
上面提到了 与(n-1)相与之后取得的是hashCode的低(n-1)位,
而又因为n值不会过大(毕竟是个数组的长度),如果只取原本hashCode的低(n-1)位,
其余的高位hashCode没参与运算,都是低位参与的容易产生冲突
那我们如何让高位也参与运算呢? ===> 将hashCode(32位编码)的上一半刚好是16位右移
并用右移之后的结果与原来的hashCode进行异或运算 这样得到的结果也有高位数据的参与
(n-1)&(hashCode>>>16)
总结下来就是让hashCode的高低位都参与到与运算中,并且保证与运算之后的结果(index)是落在
数组之内的