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可能會產生相同...