hashMap演算法的實現

2021-06-22 11:40:10 字數 787 閱讀 4653

昨天專案發布間隙,看了下hashmap的演算法。關鍵在於:

static int hash(int h)

和 static int indexfor(int h, int length)

這2個方法。

注意,這2個方法一定要配合使用,否則就比較難理解了。

這裡我解答幾個問題,

1. hash方法裡傳入的是物件的hashcode,而物件的hashcode是物件的記憶體位址,已經保證了唯一性,為什麼還要再進行hash計算?

回答:由於hash表的大小有限,不可能無限大,以hashmap實現中的indexfor方法來講,是以與操作來計算的。那麼假如hashcode轉換成二進位制以後,末尾相同的話,

那麼計算出來的index也就一樣了,造成雜湊度不夠。

2. indexfor方法為什麼針對length-1做與操作?

回答:與操作將會把超出陣列長度的部分截斷,另外map初始化的時候會做如下操作:

while (capacity < initialcapacity)

capacity <<= 1;

這樣,length肯定為2的n次方,好處是length-1轉換成2進製每一位都是1,在做&操作的時候每乙個坑都有機會得到值,否則假如有1位為0的情況,那一位就會浪費。

3.我這裡對hash函式有個疑問,這個演算法的目的是把原始資料分成3斷進行異或操作達到雜湊,但是我感覺最後結果的前4位是不會發生變。假如有資料前4位不一樣,剛好hash表的長度是後面的28位,那麼這個時候就會出現hash衝突了。不知道我這個理解對不對,請大家指正,謝謝。

hashmap的雜湊演算法

static final int hash object key int h return key null 0 h key.hashcode h 16 三元運算子 條件表示式?表示式1 表示式2 按位異或運算,只要位不同結果為1,不然結果為0 右移 右邊的位被擠掉,右移一位其值相當於除以2。如圖,...

HashMap的實現原理

一。hashmap的資料結構 資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列 陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小...

實現HashMap的排序

已知乙個hashmap集合,user有name string 和 age int 屬性,請寫乙個方法實現對hashmap的排序功能,該方法接受hashmap為形參,返回型別為hashmap,要求對hashmap中的user的age倒序進行排序,排序時key value鍵值對不能拆散。注意 hashm...