
Java 集合框架中,Map 獨立於 Collection 體系,存儲鍵值對。核心實現類特性對比:
| 實現類 | 有序性 | 線程安全 | 鍵值為 null | 底層結構 | 典型場景 |
|---|---|---|---|---|---|
| HashMap | 無序 | 非線程安全 | 允許 1 個 null key、多個 null value | 數組+鏈表/紅黑樹(JDK8) | 高頻讀寫、非併發 |
| LinkedHashMap | 插入序/訪問序 | 非線程安全 | 同 HashMap | 雙向鏈表維護順序 | LRU 緩存、順序遍歷 |
| TreeMap | 鍵自然序/定製序 | 非線程安全 | 不允許 null key | 紅黑樹 | 範圍查詢、有序遍歷 |
| Hashtable | 無序 | 同步方法鎖 | 不允許 null | 數組+鏈表 | 歷史遺留、已被 ConcurrentHashMap 替代 |
| ConcurrentHashMap | 無序 | 分段鎖/CAS+synchronized | 不允許 null | 數組+鏈表/紅黑樹 | 高併發讀寫 |
| WeakHashMap | 無序 | 非線程安全 | 弱引用鍵,GC 時自動清理 | 數組+鏈表 | 緩存、監聽器映射 |
| IdentityHashMap | 無序 | 非線程安全 | 允許 null | 線性探測哈希表 | 引用語義比較(==而非equals) |
public interface Map {
int size(); boolean isEmpty();
boolean containsKey(Object key); boolean containsValue(Object value);
V get(Object key); V put(K key, V value); V remove(Object key);
void putAll(Map extends K, ? extends V> m); void clear();
Set keySet(); Collection values(); Set> entrySet();
interface Entry { K getKey(); V getValue(); V setValue(V value); ... }
}
三大視圖集合:keySet()(鍵集合)、values()(值集合)、entrySet()(鍵值對集合,最高效遍歷方式)。
AbstractMap 實現了除 entrySet()、put() 外的所有方法,採用模板方法模式:
size() 委託 entrySet().size()get(key) 遍歷 entrySet() 比對鍵putAll(m) 迭代調用 put()(子類必須重寫)keySet()/values() 返回基於 entrySet() 迭代器的動態視圖equals()/hashCode() 基於 Entry 集合內容計算,滿足 Map 等值契約SimpleEntry、SimpleImmutableEntry 兩種 Entry 實現,均可序列化子類只需實現 entrySet() 返回具體 Set,並視需求重寫 put() 即可獲得完整 Map 功能。
public interface SortedMap extends Map {
Comparator super K> comparator(); // 返回比較器,null 表示自然序
SortedMap subMap(K fromKey, K toKey); // [fromKey, toKey)
SortedMap headMap(K toKey); // [first, toKey)
SortedMap tailMap(K fromKey); // [fromKey, last]
K firstKey(); K lastKey();
}
要求所有鍵實現 Comparable 或構造時提供 Comparator,否則拋 ClassCastException。
繼承 SortedMap,新增「鄰近鍵」查詢與「反序視圖」:
lowerEntry(k)(<k)、floorEntry(k)(≤k)、ceilingEntry(k)(≥k)、higherEntry(k)(>k)firstEntry()、lastEntry()、pollFirstEntry()(移除並返回)、pollLastEntry()descendingMap()、descendingKeySet()、navigableKeySet()subMap(from, fromIncl, to, toIncl)、headMap(to, inclusive)、tailMap(from, inclusive)TreeMap 同時實現 NavigableMap 與 Cloneable、Serializable,是有序映射首選。
public abstract class Dictionary {
public abstract int size(); public abstract boolean isEmpty();
public abstract Enumeration keys(); // 返回鍵枚舉
public abstract Enumeration elements(); // 返回值枚舉
public abstract V get(Object key); public abstract V put(K key, V value);
public abstract V remove(Object key);
}
Hashtable 繼承 Dictionary 並實現 Map,方法皆 synchronized,枚舉遍歷使用 Enumeration(僅單向、不可移除),已被 Iterator 取代。新代碼勿用。
AbstractMap.put() 默認拋 UnsupportedOperationException,強制子類實現寫入邏輯。keySet()/values()/entrySet() 返回的集合視圖不支持 add(),entrySet() 迭代器支持 remove()(通過調用 Map.remove)。equals() 比較邏輯:同類型 Map、size 相等、逐 Entry 比對 value(key 隱含於 Entry 映射關係中)。hashCode() 為所有 Entry hashCode() 之和,保證 m1.equals(m2) → m1.hashCode()==m2.hashCode()。toString() 輸出格式 {k1=v1, k2=v2},自引用顯示 (this Map)。