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

Java 集合框架深度解析:Map 體系架構與核心源碼剖析

     編輯:Java 綜合教學

Map 體系整體架構

Map架構圖

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)

Map 接口核心契約

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 m); void clear();
    Set keySet(); Collection values(); Set> entrySet();
    interface Entry { K getKey(); V getValue(); V setValue(V value); ... }
}

三大視圖集合:keySet()(鍵集合)、values()(值集合)、entrySet()(鍵值對集合,最高效遍歷方式)。

AbstractMap 骨架實現分析

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 功能。

SortedMap 與 NavigableMap 進階導航

SortedMap 有序映射

public interface SortedMap extends Map {
    Comparator 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。

NavigableMap 導航增強

繼承 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,是有序映射首選。

Dictionary 歷史遺留類


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 取代。新代碼勿用。

源碼級關鍵點總結

  1. AbstractMap.put() 默認拋 UnsupportedOperationException,強制子類實現寫入邏輯。
  2. keySet()/values()/entrySet() 返回的集合視圖不支持 add(),entrySet() 迭代器支持 remove()(通過調用 Map.remove)。
  3. equals() 比較邏輯:同類型 Map、size 相等、逐 Entry 比對 value(key 隱含於 Entry 映射關係中)。
  4. hashCode() 為所有 Entry hashCode() 之和,保證 m1.equals(m2) → m1.hashCode()==m2.hashCode()。
  5. toString() 輸出格式 {k1=v1, k2=v2},自引用顯示 (this Map)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved