hashmap计算key的hash的时候为什么要右移16位
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
hashmap计算key的hash的时候,右移16位目的是为了让低16位包含完整的hash值的信息,因为大部分情况下,hashmap的数组长度是小于2的16次方的,
而计算index或者说索引或者说桶的时候,是用hashmap的数组长度-1 & 上面计算的hash值,所以如果上面提到的hash值包含整个hash的32位信息的话,极大的减少了hash碰撞的可能性
因为数组长度-1的二进制绝大部分场景是不会超过2的16次方,也就是二进制的16位的,所以16位到32位都是0,和上面的hash值计算&的结果从16到32位也都是0
计算index:
if ((p = tab[i = (n - 1) & hash]) == null)