static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
三元运算符:条件表达式?表达式1:表达式2
^按位异或运算,只要位不同结果为1,不然结果为0;
“<<” 左移:右边空出的位上补0,左边的位将从字头挤掉,左移一位其值相当于乘2。
">>"右移:右边的位被挤掉,右移一位其值相当于除以2。
:
如图,h有32位,将其右移16位后,高位补0,原本处于高16位的1111 1111 1111 1111
就处于低16位。
再与最初的h进行异或运算。
为什么右移 16 位,为什么要使用 ^ 位异或?
一个好的哈希算法能够使得元素分布的更加均匀,从而减少哈希冲突。
有这样一个数学规律:
当 lenth = 2^n 时,X % length = X & (length - 1)
也就是说,长度为2的n次幂时,模运算 % 可以变换为按位与 & 运算。
如:9 % 4 = 1
9 & 3 = 1001 & 0011 = 0001 = 1