HashMap為什麼樹化

2021-09-02 22:10:18 字數 617 閱讀 4354

在jdk1.8中,hashmap做了一些改變:

jdk1.7中,發生雜湊碰撞時,將鍵值對新增到鍊錶頭部,jdk1.8是將鍵值對新增到鍊錶尾部。

jdk1.8中,如果鍊錶的長度超過8,將會將鍊錶轉化為紅黑樹。

容量的初始化:jdk1.7的hashmap在構造時會對容量進行初始化,而jdk1.8是在首次向hashmap總中執行put操作時,對容量進行初始化,也就是說,jdk1.8的hashmap使用了懶漢模式(在使用時才初始化),避免了初始化後卻不用的資源浪費。

那為什麼要進行樹化的改造呢?

主要是為了避免雜湊碰撞拒絕服務攻擊

從效能角度來看:解決雜湊衝突時使用鍊錶,插入和刪除的效率很高,只需o(1)的時間複雜度,但對於查詢而言,則需要o(n)的時間負責度。但紅黑樹的插入,刪除,查詢的最差時間複雜度為o(logn)。惡意**可以利用大量資料與伺服器互動,比如string的hashcode函式的強度很弱,有人可以很容易的構造出大量hashcode相同的string物件。如果向伺服器一次提交數萬個hashcode相同的字串,伺服器的查詢時間過長,讓伺服器的cpu被大量占用,當有其他更多的請求時伺服器會拒絕服務。而使用紅黑樹可以將查詢時間降低到一定的數量級,可以有效避免雜湊碰撞拒絕服務攻擊。

HashMap的樹化因子為什麼是8

網上主流的答案 紅黑樹的平均查詢長度是log n 如果長度為8,平均查詢長度為log 8 3,鍊錶的平均查詢長度為n 2,當長度為8時,平均查詢長度為8 2 4,紅黑樹的查詢效率更高,這才有轉換成樹的必要 鍊錶長度如果是小於等於6,6 2 3,而log 6 2.6,雖然速度也很快的,但是轉化為樹結構...

使用HashMap時為什麼需要設定初始化大小

hashmap有擴容機制,就是當達到擴容條件時會進行擴容。hashmap的擴容條件就是當hashmap中的元素個數 size 超過臨界值 threshold 時就會自動擴容。在hashmap中,threshold loadfactor capacity。所以,如果我們沒有設定初始容量大小,隨著元素的...

hashmap為什麼不安全

第一點多執行緒同時put的時候 在某一時刻同時操作hashmap並執行put操作,而有大於兩個key的hash值相同,如圖中a1 a2,這個時候需要解決碰撞衝突,而解決衝突的辦法上面已經說過,對於鍊錶的結構在這裡不再贅述,暫且不討論是從鍊錶頭部插入還是從尾部初入,這個時候兩個執行緒如果恰好都取到了對...