JDK容器學習之Map: HashMap,TreeMap,LinkedHashMap對比小結

HashMap, TreeMap, LinkedHashMap 對比

1. 存儲結構

HashMap 存儲結構: 數組 + 鏈表 + 紅黑樹數組

LinkedHashMap 存儲結構 和HashMap 相同,區別是維護一個根據插入順序保持的雙向鏈表安全

LinkedHashMap結構

TreeMap 存儲結構: 紅黑樹數據結構

TreeMap結構


2. 是否有序

HashMap 無序多線程

LinkedHashMap 根據插入前後順序肯定遍歷順序學習

TreeMap 有序,根據Key進行比較獲取前後順序.net


3. 迭代

HashMap 迭代線程

  • 從頭開始遍歷數組
  • 若數組中該索引處爲null,或者Node的next指向null,則掃描數組的下一位
  • 若數組中該索引處非null,切Node的next指向另外一個Node,則依次掃描Node的next元素,直到爲null

示意圖以下:code

LinkedHashMap 迭代blog

  • 掃描內部的雙向鏈表
  • 從head指向的Node節點出發,依次掃描 after指向的下一個Node節點,直到最後一個

TreeMap 迭代排序

由於TreeMap是紅黑樹,左孩子 < 根 < 右孩子,

因此按照樹的中序遍歷方式進行掃描,即先獲取樹的左孩子,而後是根,最後是右孩子

示意圖以下:


4. 應用場景&使用小建議

  1. HashMap, LinkedHashMap, TreeMap 非線程安全,所以都不適用於多線程環境下

  2. 但願有序的Map,考慮採用 LinkedHashMap, TreeMap

  • 有本身的排序需求場景的,可使用TreeMap
  • 根據塞入Map的前後順序進行排序的,可使用 LinkedHashMap
  1. 其餘普通kv接口存儲,儘可能採用 HashMap
  • 若能肯定Map的元素個數,在初始化時,顯示指定容量大小,避免頻繁的數組擴容
  • key的hash儘可能分散,避免出現大量的hash碰撞(通常不本身覆蓋 key的 hashcode 方法,這個問題不太大)
  1. 有自定義排序需求時,使用 TreeMap
  • 儘可能保證結構的穩定,不會頻繁出現添加刪除的狀況(由於會致使)
  • Map中不存在兩個Key經過定義的比較器,返回0,即不存在相似 HashMap 的碰撞狀況
  1. 根據進入Map的前後肯定遍歷順序,使用 LinkedHashMap
  • 聽從 HashMap 的使用規則

相關博文

關注更多

掃一掃二維碼,關注小灰灰blog

小灰灰blog

相關文章
相關標籤/搜索