面試題總結:HashMap實現原理

華山棧道發表於2020-10-29

1.簡單瞭解:

JDK1.8中,HashMap採用位桶+連結串列+紅黑樹實現,當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢時間。

HashCode是jdk根據物件的地址或字串或者數字利用hash演算法計算出的int型別的數值。

2.HashMap實現原理詳解:

陣列->連結串列->紅黑樹

首先有一個每個元素都是連結串列的陣列,當新增一個元素(key-value)時,就首先計算元素key的hash值,以此確定插入陣列中的位置,但是可能存在同一hash值的元素已經被放在陣列同一位置了,這時就新增到同一hash值的元素的後面,他們在陣列的同一位置,但是形成了連結串列,同一各連結串列上的Hash值是相同的,所以說陣列存放的是連結串列。而當連結串列長度太長時,連結串列就轉換為紅黑樹,這樣大大提高了查詢的效率。
在jdk8中,HashMap處理“碰撞”增加了紅黑樹這種資料結構,當碰撞結點較少時,採用連結串列儲存,當較大時(>8個),採用紅黑樹(特點是查詢時間是O(logn))儲存(有一個閥值控制,大於閥值(8個),將連結串列儲存轉換成紅黑樹儲存)

3.紅黑樹是一種自平衡二叉查詢樹

紅黑樹是每個節點都帶有顏色屬性的二叉查詢樹,顏色或紅色或黑色。 對於任何有效的紅黑樹都有以下要求:

  • 1)節點是紅色或黑色。
  • 2)根節點是黑色。
  • 3)每個葉節點是黑色的。
  • 4)每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
  • 5從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
    在這裡插入圖片描述

相關文章