hashmap在jdk1.8之後引入了紅黑樹的概念,表示若桶中鍊錶元素超過8時,會自動轉化成紅黑樹;若桶中元素小於等於6時,樹結構還原成鍊錶形式。
原因:紅黑樹的平均查詢長度是log(n),長度為8,查詢長度為log(8)=3,鍊錶的平均查詢長度為n/2,當長度為8時,平均查詢長度為8/2=4,這才有轉換成樹的必要;鍊錶長度如果是小於等於6,6/2=3,雖然速度也很快的,但是轉化為樹結構和生成樹的時間並不會太短。
還有選擇6和8的原因是:
中間有個差值7可以防止鍊錶和樹之間頻繁的轉換。假設一下,如果設計成煉表個數超過8則鍊錶轉換成樹結構,鍊錶個數小於8則樹結構轉換成鍊錶,如果乙個hashmap不停的插入、刪除元素,鍊錶個數在8左右徘徊,就會頻繁的發生樹轉鍊錶、鍊錶轉樹,效率會很低。
jdk1 8對HashMap的改進
1,jdk1.7底層採用entry陣列 鍊錶的資料結構,而1.8採用node陣列 鍊錶 紅黑樹的資料結構。2,jdk1.7的hashmap插入新值時使用頭插法,1.8使用尾插法。使用頭插法比較快,但在多執行緒擴容時會引起倒序和閉環的問題。所以1.8就採用了尾插法。3,擴容後新錶中的索引位置計算方式不...
HashMap 底層 原理(JDK 1 8)
原來看過1.7的hashmap底層,1.8更新後也稍微看了一下,沒有進行仔細的總結,今天總結一下1.8底層的原理。本文只討論1.8的底層原理。以下全文為1.8版本的 對於hashmap的資料結構,是老生常談了,面試的時候經常會被問道。底層資料結構為陣列 鍊錶 紅黑樹,儲存的是node節點,紅黑樹是t...
HashMap原始碼分析 JDK1 8
陣列 鍊錶 紅黑樹 陣列儲存元素,當有衝突時,就在該陣列位置形成乙個鍊錶,儲存衝突的元素,當鍊表元素個數大於閾值時,鍊錶就轉換為紅黑樹。transient node table transient int size int threshold final float loadfactor 預設初始容...