接口繼承體系
Map (K,V)
├── SortedMap (Key 有序、Comparator)
│ └── NavigableMap (導航方法:floor/ceiling/higher/lower...)
└── ConcurrentMap (並發操作)
└── ConcurrentNavigableMap
核心實現類對比
| 類 | 底層結構 | 有序性 | 線程安全 | Null Key/Value | 特色 |
| HashMap | 數組+鏈表/紅黑樹 | 無序 | 否 | 允許 1 null key | 通用高性能 |
| LinkedHashMap | HashMap+雙向鏈表 | 插入/訪問序 | 否 | 允許 | LRU 緩存基礎 |
| TreeMap | 紅黑樹 | Key 自然序/Comparator | 否 | 不允許 null key | 範圍查詢、有序遍歷 |
| Hashtable | 數組+鏈表 | 無序 | 是 (全鎖) | 不允許 | 舊版、已被 ConcurrentHashMap 取代 |
| WeakHashMap | HashMap+弱引用 Key | 無序 | 否 | 允許 | Key 無強引用時自動移除 |
| ConcurrentHashMap | Node[]+CAS+synchronized | 無序 | 是 (細粒度) | 不允許 | 高併發首選 |
NavigableMap 導航方法詳解
NavigableMap map = new TreeMap<>();
map.put("d", "4"); map.put("b", "2"); map.put("f", "6");
// 向下查找 (≤)
map.floorEntry("c"); // b=2
map.floorKey("c"); // b
// 向上查找 (≥)
map.ceilingEntry("c"); // d=4
map.ceilingKey("c"); // d
// 邊界
map.firstEntry(); // 最小
map.lastEntry(); // 最大
map.pollFirstEntry(); // 取出並移除最小
map.pollLastEntry(); // 取出並移除最大
// 子視圖 (視圖修改影響原 Map)
map.subMap("b", true, "f", false); // [b, f)
map.headMap("d", true); // ≤ d
map.tailMap("d", false); // > d
// 反序視圖
NavigableMap desc = map.descendingMap();
WeakHashMap 原理與場景
- Key 為
WeakReference,GC 掃描到無強引用 Key 時,Entry 自動失效
- 需定期調用
size() 或遍歷觸發清理
- 典型場景:緩存元數據、監聽器註冊表、ClassLoader 相關緩存
AbstractMap 骨架實現
模板方法模式:子類實現 entrySet(),父類提供 keySet()、values()、putAll、toString、equals/hashCode 等通用邏輯。
選型速查
- 一般業務 →
HashMap
- 需保持插入順序 →
LinkedHashMap
- 需 Key 有序/範圍查詢 →
TreeMap
- 高併發讀寫 →
ConcurrentHashMap
- 緩存、生命週期跟隨 Key →
WeakHashMap
- 舊代碼兼容 →
Hashtable(不推薦新項目)
- 上一篇文章: Java 集合框架全景圖解:Collection、Map、迭代器、工具類核心架構與實現類詳解
- 下一篇文章: Eclipse 整合 Tomcat 啟動正常但無法訪問 localhost:8080 的解決方案
Copyright ©
程式碼之家 All Rights Reserved