HashMap儲存原理

2021-09-27 18:44:08 字數 871 閱讀 4163

hashmap儲存的資料存放在記憶體中,提高hashmap資料定址速度是重點要解決的問題,所以hashmap底層的儲存結構非常關鍵,如果使用陣列儲存,時間複雜度為o(1),使用鍊錶儲存,時間複雜度為o(n),如果使用二叉樹儲存,時間複雜度為o(lg(n))。所以hashmap優先使用陣列儲存,如果出現hash碰撞,採用鍊錶儲存,如果鍊錶長度大於8,定址速度明顯下降,進一步採用紅黑樹儲存,將定址效率提高。

如果下圖為hashmap儲存

元素分配hash桶

向hashmap中put(key,value)資料時,首先計算key的雜湊值,將hash值%16計算出hash桶序號n(0-16之間),將元素存放在n號hash桶,存放的資料時map.entry包括key值和value值

當存放兩個元素獲取hash並且mod 16得到hash桶編號相同時,出現hash碰撞,hash桶使用鍊錶儲存這兩個物件,使用hashmap.get(key)獲取這兩個物件時,需要兩步實現,首先得到它們對應的hash桶號,在根據key與鍊錶中的key1=value1比較key.equale(key1),找出對應元素,這樣需要遞迴遍歷列表中的元素,執行效率降低。

當鍊表長度大於8時,hashmap將鍊錶儲存轉化為紅黑樹儲存,紅黑樹遍歷每次可以減少乙個分支,效率比煉表高,其時間複雜度為o(lg(n))。

hashmap擴容

hashmap使用陣列儲存,預設長度為16,載入因子為0.75,當hashmap的hash桶數量的75%被分配使用時,hashmap擴容為原來的兩倍。擴容時原來陣列位址放棄,重新分配位址空間,並將原來對應的資料複製過來。此過程為rehashing,jdk1.7在多執行緒環境下hashmap擴容可以導致無限迴圈,因為擴容過程中會新陣列會和原來的陣列有指標引用關係。在jdk1.8中在多執行緒環境下hashmap擴容可以導致資料丟失。

HashMap的儲存原理

hashmap是乙個陣列加鍊表的結構構成。模運算 效率低 index hashcode table.length 在容量擴容為兩倍時,需要再次rehash確定每個元素位置,浪費效能。位運算 效率高 index hashcode table.length 1 index的值完全取決於key的hashc...

HashMap的儲存結構及原理

1 hashmap的資料結構 hashmap通過hashcode對其內容進行快速查詢,是無序的 資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列 陣列的儲存區是連續的,占用記憶體嚴重,故空間複雜度很大。但陣列的二分查詢時間度小 陣列的特點 定址容易,插入和 刪除困難。鍊錶 鍊...

HashMap底層(1 7和1 8)的儲存原理

首先說一下jdk1.7版本的存放原理 當例項化後,底層會直接建立乙個長度為16的一維陣列entry table 然後,說一下新增元素時,呼叫put方法 三種情況儲存 方式一 底層根據key計算hash值,計算出索引位置,檢視當前位置是否有值,如果沒有值,直接存放。情況二 當計算出的索引位置,有值時 ...