1. 程式人生 > >面試專題(二):HashMap底層執行原理

面試專題(二):HashMap底層執行原理

一、HashMap的資料結構

在這裡插入圖片描述
首先有一個數組,如果hashMap不進行擴容的話預設是16個長度的陣列,如果有hash衝突的話會使用單向連結串列來解決衝突。

1.1 HashMap的儲存結構

陣列、連結串列、紅黑樹(jdk1.8)
HashMap中不單單隻有陣列結構,還有連結串列、紅黑樹

1.2 HashMap的特點

1.2.1 快速儲存(put)
1.2.2 快速查詢(時間複雜度O(1))(get)
1.2.3 可伸縮(陣列可以邊長;單向連結串列長度超過8以後可以變成紅黑樹)

二、Hash演算法(HashMap的核心)

要了解HashMap底層執行原理必須瞭解HashMap的核心–hash演算法

2.1 Hash演算法

所有的Java物件(Object.hashCode可以得到一個hash值)都有hashCode(hashMap中使用物件的hashCode去計算hash值)
具體的hash值的計算方法:(hashCode)^(hashCode>>>16)
這樣算可以確保得出的數足夠的隨機、分散(算陣列下標的時候要使用這個hash值,hash值足夠的隨機、分散才能保證算出的陣列下標的值足夠的分散)。

2.2 陣列下標計算

hashMap底層是陣列組成的,陣列的預設大小是16,陣列的下標是如何計算的呢
使用2.1計算出來的hash值再進行運算計算出來的:hash%16
HashMap中算下標的方式:hash&(16-1) 這樣的效率會更高

三、Hash衝突

原因:不同的物件計算出來陣列下標是相同的

單向連結串列:用於解決Hash衝突的方案,加入一個next記錄下一個節點。如果連結串列非常長的話,效率是非常低的,所以在jdk1.8之後採用了紅黑樹。
在這裡插入圖片描述

三、HashMap擴容

HashMap底層是用陣列儲存資料的,陣列儲存的話不可能所有的陣列存滿16以後就變成連結串列,上面說了連結串列過長會影響效率,連結串列只是為了解決衝突準備的。
陣列擴容的原理:儲存量達到75% (一個數組有16個長度,75%大概就是12個長度)就對陣列進行擴容,由於計算機裡都是二進位制的,所以擴容的標準是最好是變長2倍。75%是基於時間與空間的考慮,如果擴容比例設得很小,例如是50%,那麼有一半的空間是浪費的,如果比例設定得很高,例如是90%,當發生hash衝突的時候很難去觸發這個條件。

四、紅黑樹

紅黑樹是一種二叉樹,有著高效的檢索效率
在這裡插入圖片描述
觸發條件:在連結串列的長度大於8的時候,將後面的資料存在紅黑樹中 。當連結串列的長度小於6的時候,又會把紅黑樹轉化成連結串列