首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Map 集合家族全景解析:HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap 等 8 大實現深度對比

     編輯:Java 綜合教學

Java Map 集合家族全景解析:HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap 等 8 大實現深度對比

Map 繼承體系圖

Java 集合框架中,Map 介面定義了鍵值對映射契約,JDK 提供了 8 款主流實現,各具特色適用場景。本文從執行緒安全性、有序性、效能、Null 支援等維度全方位對比,助你精準選型。

對比總覽表

實現類執行緒安全有序性Null Key/Value底層結構典型場景
Hashtable✓ (同步鎖全表)無序✗/✗陣列+鏈表舊版專案維護
Properties✓無序僅 String繼承 Hashtable配置檔讀取
HashMap✗無序✓/✓陣列+鏈表/紅黑樹通用單執行緒映射
TreeMap✗Key 自然序/Comparator✗/✓紅黑樹需排序遍歷
LinkedHashMap✗插入序/訪問序✓/✓雙向鏈表+雜湊表LRU 快取、保持插入序
WeakHashMap✗無序✓/✓弱引用 Key記憶體敏感快取
ConcurrentHashMap✓ (分段鎖/CAS)無序✗/✗Segment/Node+CAS高併發讀寫
ConcurrentSkipListMap✓ (跳表)Key 有序✗/✗跳表高併發+需排序

深度解析

1. Hashtable — 過時的同步映射

  • 所有公開方法加 synchronized,鎖住整張表,效能差
  • 初始容量 11、負載因子 0.75,可調優
  • 建議:棄用,改用 Collections.synchronizedMap(new HashMap()) 或 ConcurrentHashMap

2. Properties — 配置檔專用

  • 繼承 Hashtable,Key/Value 僅支援 String
  • 提供 load()/store() 直接讀寫 .properties/.xml
  • 推薦用 setProperty() 而非 put(),確保型別安全

3. HashMap — 通用王者 (JDK 8+ 優化)

  • 雜湊桶 + 鏈表,鏈表長度 ≥ 8 且容量 ≥ 64 時樹化為紅黑樹
  • 支援 Null Key (僅一個) 與多個 Null Value
  • 擴容機制:容量 * 負載因子 觸發 rehash,新容量約 2 倍
  • 非執行緒安全,多執行緒環境易導致死循環或資料遺失

4. TreeMap — 有序映射首選

  • 紅黑樹實現 NavigableMap,Key 必須實現 Comparable 或提供 Comparator
  • get/put/remove 平均 O(log n),比 HashMap O(1) 慢
  • 適用:需按 Key 排序遍歷、範圍查詢 (subMap)、最近鍵搜尋 (floorKey)
  • 技巧:平時用 HashMap 存儲,輸出時 new TreeMap<>(hashMap) 轉換

5. LinkedHashMap — 保持順序的 HashMap

  • 雙向鏈表維護進入順序 (預設) 或訪問順序 (accessOrder=true)
  • LRU 快取經典實現:覆寫 removeEldestEntry() 返回 true 移除最舊
  • 迭代順序可預測,適合序列化輸出、配置項保序

6. WeakHashMap — 自動清理的弱引用映射

  • Key 為弱引用,GC 時 Key 無強引用則 Entry 自動移除
  • Value 不受影響,需注意記憶體洩漏風險
  • 適用:Metadata 註冊表、ClassLoader 快取等 Key 生命週期不可控場景

7. ConcurrentHashMap — 高併發首選 (JDK 8 重大重寫)

  • JDK 7:Segment 分段鎖 (預設 16 段),鎖粒度細化
  • JDK 8:放棄 Segment,採用 Node[] + synchronized + CAS,效能大增
  • 僅 put/remove 同步,get 無鎖讀取 (volatile 保證可見性)
  • 不支援 Null Key/Value,避免歧義
  • size() 使用 LongAdder 高併發計數

8. ConcurrentSkipListMap — 有序併發映射

  • 跳表實現,containsKey/get/put/remove 平均 O(log n)
  • Key 天然有序,支援 NavigableMap 全套範圍操作
  • 併發度極高,讀寫幾乎無阻塞,適合高併發排序場景
  • size() 需遍歷計數,O(n),頻繁呼叫慎用

選型決策樹

  1. 需執行緒安全? → 否 → 第 2 步;是 → 需有序? → 是 → ConcurrentSkipListMap;否 → ConcurrentHashMap
  2. 需 Key 有序? → 是 → TreeMap;否 → 第 3 步
  3. 需保持插入/訪問順序? → 是 → LinkedHashMap;否 → 第 4 步
  4. Key 需自動過期? → 是 → WeakHashMap;否 → HashMap (通用首選)
參考來源:Java 集合框架之 Map 深度解析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved