HashMap存儲結構

HashMap存儲結構
這裏需要區分一下,JDK1.7和 JDK1.8之後的 HashMap 存儲結構。在JDK1.7及之前,是用數組加鏈表的方式存儲的。
但是,衆所周知,當鏈表的長度特別長的時候,查詢效率將直線下降,查詢的時間複雜度爲 O(n)。因此,JDK1.8 把它設計爲達到一個特定的閾值之後,就將鏈表轉化爲紅黑樹。
這裏簡單說下紅黑樹的特點:

  1. 每個節點只有兩種顏色:紅色或者黑色
  2. 根節點必須是黑色
  3. 每個葉子節點(NIL)都是黑色的空節點
  4. 從根節點到葉子節點,不能出現兩個連續的紅色節點
  5. 從任一節點出發,到它下邊的子節點的路徑包含的黑色節點數目都相同

由於紅黑樹,是一個自平衡的二叉搜索樹,因此可以使查詢的時間複雜度降爲O(logn)。(紅黑樹不是本文重點,不瞭解的童鞋可自行查閱相關資料哈)

爲什麼要引入紅黑樹?

JDK 1.8以前是數組+鏈表,還未引入紅黑樹,這就導致了鏈表過長時查找的時間複雜度是O(n), 完全失去了設計HashMap時的設計初衷,針對這種情況JDK 1.8引入了紅黑樹(查找的時間複雜度爲O(logN),什麼是紅黑樹呢,紅黑樹是一種自平衡的二叉查找樹,不是一種絕對平衡的二叉樹,它放棄了追求絕對平衡,追求大致平衡,在與平衡二叉樹的時間複雜度相差不大的情況下,保證每次插入最多只需要三次旋轉就能達到平衡,實現起來也更爲簡單。從而獲得更高的查找性能。
 

HashMap 結構示意圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章