
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 有序 | ✗/✗ | 跳表 | 高併發+需排序 |
synchronized,鎖住整張表,效能差Collections.synchronizedMap(new HashMap()) 或 ConcurrentHashMapStringload()/store() 直接讀寫 .properties/.xmlsetProperty() 而非 put(),確保型別安全NavigableMap,Key 必須實現 Comparable 或提供 Comparatorget/put/remove 平均 O(log n),比 HashMap O(1) 慢subMap)、最近鍵搜尋 (floorKey)new TreeMap<>(hashMap) 轉換accessOrder=true)removeEldestEntry() 返回 true 移除最舊Node[] + synchronized + CAS,效能大增put/remove 同步,get 無鎖讀取 (volatile 保證可見性)size() 使用 LongAdder 高併發計數containsKey/get/put/remove 平均 O(log n)NavigableMap 全套範圍操作size() 需遍歷計數,O(n),頻繁呼叫慎用參考來源:Java 集合框架之 Map 深度解析