剖析HashMap結構

2021-10-07 13:28:34 字數 906 閱讀 7814

haspmap資料結構是:陣列 + 鍊錶

在jdk1.8之後為了解決hashmap鍊錶過程,導致遍歷產生的時間過長,引入了紅黑樹進行了進一步優化。

總結:hashmap的資料結構包括了初始陣列、鍊錶、紅黑樹;

插入資料的時候使用pos = key % size 來進行插入資料;

當兩個或者兩個以上的key的相同就會發生衝突,就會掛在陣列初始位置的鍊錶後;

當某個節點後出現過多的鍊錶節點的時候,就會轉換成紅黑樹以提高效率。

陣列容量2的倍數:

1)提高運算速度;

2)增加雜湊度,降低衝突;

3)減少記憶體碎片。

hash函式與pos定位:hashcode的高16位與低16位進行異或求模,增加了雜湊度,降低了衝突。

插入衝突:通過單鏈表解決衝突,如果鍊錶長度超過(treeify_threshold = 8),進行單鏈表和紅黑樹的轉換以提高查詢速度。

擴容:1)擴容的條件:實際節點數大於等於容量的四分之三;

2)擴容後資料排布:要麼是原下標的位置,要麼是原下標 + 原容量的位置

序列化:只儲存了陣列的容量、實際節點數量和各個節點的key、value值。

hash map的資料結構剖析及相關方法

hash map是個很有用的索引結構,對於大規模資料檢索的時候,用處大大的。本文基於原始碼的基礎上,從資料結構開始剖析,進而介紹一些常用的方法。hash map是基於hash table基礎上封裝的方法類,下面看看hash table的資料結構 template,class equalkey equ...

HashMap底層原理簡單剖析

1 hashmap的儲存結構 陣列 鍊錶 紅黑樹 jdk1.8 如下圖所示 2 hashmap的特點,如何實現 我們知道hashmap是一種可以快速儲存很快速查詢的鍵值容器,那麼jdk是如何實現hashmap的快速儲存和快速查詢呢?我們先從陣列和鍊錶以及二叉查詢樹這三種資料結構說起 1 陣列 陣列結...

HashMap底層原始碼剖析

陣列 單向鍊錶 紅黑樹 陣列 陣列每一項都是乙個鍊錶,其實就是陣列和鍊錶的結合體 單向鍊錶 當法神hash碰撞時,首先會找到陣列對應位置,然後1.8採用尾插入法 1.7採用頭插入法 形成乙個單項鍊表結構 紅黑樹 當陣列中每項的鍊錶長度大於8時,會轉換為紅黑樹 hash碰撞 不同的key可能會產生相同...