jdk1 8對HashMap的改進

2022-06-26 16:09:16 字數 475 閱讀 3575

1,jdk1.7底層採用entry陣列+鍊錶的資料結構,而1.8採用node陣列+鍊錶/紅黑樹的資料結構。

2,jdk1.7的hashmap插入新值時使用頭插法,1.8使用尾插法。

使用頭插法比較快,但在多執行緒擴容時會引起倒序和閉環的問題。所以1.8就採用了尾插法。

3,擴容後新錶中的索引位置計算方式不同,jdk1.7擴容時是將舊表元素的所有資料重新進行雜湊計算,即hashcode & (length-1)。而1.8中擴容時只需將hashcode和老陣列長度做與運算判斷是0還是1,是0的話索引不變,是1的話索引變為老索引位置+老陣列長度。

擴容為什麼是2的n次方

1,插入新元素確定索引位置的時候是採用key的hashcode和陣列長度做與運算,即hashcode&(length-1)。模擬的是取模運算,但速度比取模快很多,要保證這種運算的正確性,必須要求陣列的長度是2的n次方。

2,在擴容時進行新索引位置的計算時也要求陣列長度是2的n次方。

jdk1 8對hashmap結構的優化

hashmap在jdk1.8之後引入了紅黑樹的概念,表示若桶中鍊錶元素超過8時,會自動轉化成紅黑樹 若桶中元素小於等於6時,樹結構還原成鍊錶形式。原因 紅黑樹的平均查詢長度是log n 長度為8,查詢長度為log 8 3,鍊錶的平均查詢長度為n 2,當長度為8時,平均查詢長度為8 2 4,這才有轉換...

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 預設初始容...