HashMap java 1.8 中的源碼:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
i = (n - 1) & hash
h >>> 16 代表無符號右移,高位補零。
hashCode() 的高16位不變,低16位與高16位異或作爲 key的最終 hash 值。
這麼做是爲了最後避免最後計算索引值只有低位參與。減少碰撞。
將得到的 hash 與通的大小 n - 1 相與得到 key 所在桶的位置。
這裏 n 是2的整數冪,所以 (n - 1) & hash 相當於 n % hash 運算,這麼做是爲了加快運算速度,這也解釋了爲什麼桶的大小要設置爲2的整數冪。