HashMap實現原理

2021-08-27 10:48:11 字數 1053 閱讀 4191

hashmap本質用一句話概括就是乙個鍊錶陣列!

下面詳細表述!

hashmap其實也是乙個線性的陣列實現的,所以可以理解為其儲存資料的容器就是乙個線性陣列。這可能讓我們很不解,乙個線性的陣列怎麼實現按鍵值對來訪問資料呢?這裡hashmap有做一些處理。

1.首先hashmap裡面實現乙個靜態內部類entry 其重要的屬性有 key , value, next,從屬性key,value我們就能很明顯的看出來entry就是hashmap鍵值對實現的乙個基礎bean,我們上面說到hashmap的基 礎就是乙個線性陣列,這個陣列就是entry,map裡面的內容都儲存在entry裡面。

2.既然是線性陣列,為什麼能隨機訪問?這裡hashmap用了乙個小演算法,大致是這樣實現:

儲存時:

int hash = key.hashcode();--> 這個hashcode方法這裡不詳述,只要理解每個key的hash是乙個固定的int值

int index = hash % entry.length;

entry[index] = value;

取值時:

int hash = key.hashcode();

int index = hash % entry.length;

return entry[index]

到這裡我們輕鬆的理解了hashmap通過鍵值對實現訪問的基本原理

問題:若兩個key通過hash % entry.length得到的index相同,是否有覆蓋的風險?

hashmap裡面用到鏈式資料結構的乙個概念.上面我們提到過entry類裡面有乙個next屬性,作用是指向下乙個entry。打個比方,第乙個鍵 值對a進來,通過計算其key的hash得到的index=0,記做:entry[0] = a.一會後又進來乙個鍵值對b,通過計算其index也等於0,現在怎麼辦?hashmap會這樣做:b.next = a,entry[0] = b,如果又進來c,index也等於0,那麼c.next = b,entry[0] = c;這樣我們發現index=0的地方其實訪問了a,b,c三個鍵值對,他們通過next這個屬性鏈結在一起。所以疑問不用擔心。

參考:

HashMap實現原理

hashmap 的get 方法 呼叫get方法返回entry public v get object key getentry方法 final entrygetentry object key 對key int hash key null 0 hash key for entrye table in...

HashMap實現原理

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

HashMap實現原理

public v put k key,v value 如果i索引處的entry為null,表明此處還沒有entry。modcount 將key value新增到i索引處。addentry hash,key,value,i return null 從上面的源 中可以看出 當我們往hashmap中put...