HashMap 內(nèi)部是一個散列表(數(shù)組?),存放時取 key 的 hashCode 作為 index 位,如果出現(xiàn)了 hash 沖突,則此 index 位以鏈表(length = 8 時轉(zhuǎn)化為 紅黑樹)形式存放。
-
hashCode 為 int 型,默認(rèn)為 -2147483648 到 2147483648,內(nèi)存無法接受這么長的散列表,故使用 node 的 length - 1 做 & 運(yùn)算??梢岳斫鉃榈臀谎诖a,也可以理解為截斷高位吧。
10100101 11000100 00100101 & 00000000 00000000 00001111 ---------------------------- 00000000 00000000 00000101 以下位代碼中的數(shù)組inedx 方法 HashMap 中的取值皆是 -> node = table[h & (length-1)] static int indexFor(int h, int length) { return h & ( length - 1 ); } -
而僅僅使用 hashCode,會有比較高的沖突概率,所以 JDK 引入了 擾動函數(shù),簡單來說就是 int 值的32位,保留自己的高位16位,并使用高位與低位做 按位異或 ^ 來做低位16位,使用這種形式來降低 hash 沖突。
image.png
