HashMap 的長度為什麼是2的冪次方

2021-10-05 22:58:10 字數 502 閱讀 5046

為了能讓 hashmap 訪問高效,盡量較少碰撞,也就是要盡量把資料分配均勻。hash 值的範圍值設定為-2147483648(2的31次方)到2147483647(2的31次方減一),前後加起來大概40億的對映空間,只要雜湊函式對映得比較均勻鬆散,一般應用是很難出現碰撞的。但問題是乙個40億長度的陣列,記憶體是放不下的。所以這個雜湊值是不能直接拿來用的。用之前還要先做對陣列的長度取模運算,得到的餘數才能用來要存放的位置也就是對應的陣列下標。這個陣列下標的計算方法是「 (n - 1) & hash 」。(n代表陣列長度)。這也就解釋了 hashmap 的長度為什麼是2的冪次方。

這個演算法應該如何設計呢?

我們首先可能會想到採用%取餘的操作來實現。但是,重點來了:「取餘(%)操作中如果除數是2的冪次則等價於與其除數減一的與(&)操作(也就是說 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。」 並且採用二進位制位操作 &,相對於%能夠提高運算效率,這就解釋了 hashmap 的長度為什麼是2的冪次方。

HashMap 的長度為什麼是2的冪次方

為了能讓 hashmap 訪問高效,盡量較少碰撞,也就是要盡量把資料分配均勻。我們上面也講到了過了,hash 值的範圍值 2147483648到2147483647,前後加起來大概40億的對映空間,只要雜湊函式對映得比較均勻鬆散,一般應用是很難出現碰撞的。但問題是乙個40億長度的陣列,記憶體是放不下...

HashMap 的長度為什麼是2的冪次方

為了能讓 hashmap 訪問高效,盡量較少碰撞,也就是要盡量把資料分配均勻。hash 值的範圍值 2147483648到2147483647,前後加起來大概40億的對映空間,只要雜湊函式對映得比較均勻鬆散,一般應用是很難出現碰撞的。但問題是乙個40億長度的陣列,記憶體是放不下的。所以這個雜湊值是不...

為什麼HashMap的長度是2的整數次冪?

一 加快雜湊計算 二 減少雜湊衝突 雜湊表索引位置的計算hash key 陣列長度 當陣列長度為2的n次方 這個公式等價於hash key length 1 計算機底層就是0和1兩個位的操作,顯然 的速度會比 快 為什麼減少雜湊衝突?看hash key length 1 如果length為奇數,le...