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

Java Map 體系架構全景解析:從 Map 到 NavigableMap 的演進脈絡

     編輯:Java 相關知識

Java 集合框架中,Map 系列接口與類構成了鍵值對存儲的核心體系。理解其架構層次、接口職責分工與實現類特性,是選型與優化的基石。本文梳理從 Map 到 NavigableMap 的完整繼承鏈,並對比主流實現類的適用場景。

一、整體架構圖譜

                    Map (Interface)
                       ↑
              AbstractMap (Abstract Class)
               ↑           ↑           ↑
          HashMap      TreeMap     WeakHashMap
                       ↑
                 SortedMap (Interface)
                       ↑
                 NavigableMap (Interface)
                       ↑
                   TreeMap (實現類)

另一條線:
    Dictionary (Legacy Abstract Class)
         ↑
      Hashtable (實現 Map、可同步、可 Enumeration)

二、核心接口與抽象類詳解

1. Map<K,V> —— 根接口

  • 定義鍵值對映射契約:鍵唯一,每個鍵映射至單一值。
  • 提供三種集合視圖:keySet()、values()、entrySet()。
  • 不保證迭代順序(HashMap 無序,TreeMap 有序)。
  • 標準構造約定:無參構造、Map 參數構造(複製構造)。

2. Map.Entry<K,V> —— 內部接口

代表單個鍵值對,提供 getKey()、getValue()、setValue()、equals()、hashCode()。entrySet() 返回 Set<Map.Entry>,是遍歷與操作條目的基礎。

3. AbstractMap<K,V> —— 骨幹實現

  • 實現 Map 大部分非抽象方法(clear、containsKey、putAll 等)。
  • 子類只需實現 entrySet() 即可得到不可修改 Map;實現 put 與迭代器 remove 即可得到可修改 Map。
  • 提供 clone()、toString() 等通用實現。

4. SortedMap<K,V> —— 有序映射接口

  • 繼承 Map,鍵按自然順序或指定 Comparator排序。
  • 所有鍵必須實現 Comparable 或被 Comparator 接受。
  • 新增範圍操作:firstKey()、lastKey()、headMap()、tailMap()、subMap()。
  • 四種標準構造函數約定(無參、Comparator、Map、SortedMap)。

5. NavigableMap<K,V> —— 導航增強接口(JDK 1.6+)

繼承 SortedMap,提供「最近匹配」導航能力,功能分四類:

類別代表方法語義
鍵值對導航lowerEntry、floorEntry、ceilingEntry、higherEntry返回 <、≤、≥、> 給定鍵的鍵值對
首尾獲取/移除firstEntry、pollFirstEntry、lastEntry、pollLastEntry獲取並可選移除最小/最大映射
鍵導航lowerKey、floorKey、ceilingKey、higherKey同理僅返回鍵
視圖與子集descendingMap、navigableKeySet、descendingKeySet、headMap/tailMap/subMap(含 inclusive 參數)反序視圖、帶邊界控制的子映射

6. Dictionary<K,V> —— 遺留抽象類

JDK 1.0 產物,功能與 Map 類似但僅支持 Enumeration 遍歷。Hashtable 繼承它並實現 Map,雙重身份導致 API 冗餘,現已不建議新代碼使用。

三、主流實現類對比速查表

實現類底層結構順序線程安全Null 鍵/值典型場景
HashMap數組+鏈表/紅黑樹無序否允許/允許通用高性能鍵值存儲
LinkedHashMapHashMap + 雙向鏈表插入序/訪問序否允許/允許需保持順序的緩存、LRU
TreeMap紅黑樹鍵自然序/Comparator 序否不允許 key 為 null範圍查詢、有序遍歷
Hashtable數組+鏈表無序是(synchronized)不允許/不允許遺留代碼、已被 ConcurrentHashMap 取代
WeakHashMap數組+鏈表(弱引用 Key)無序否允許/允許緩存、元數據映射,Key 可被 GC 回收
ConcurrentHashMap數組+鏈表/紅黑樹+CAS/synchronized無序是(高併發)不允許/不允許高併發場景首選

四、選型決策指南

  1. 無順序要求、單線程/線程隔離 → HashMap(默認首選)。
  2. 需保持插入/訪問順序 → LinkedHashMap。
  3. 需按鍵排序、範圍查詢 → TreeMap(實現 NavigableMap)。
  4. 高併發讀寫 → ConcurrentHashMap。
  5. Key 生命週期由外部管理、需自動清理 → WeakHashMap。
  6. 遺留代碼維護 → 理解 Hashtable/Dictionary 差異,新代碼禁用。

五、核心總結

  • Map 定義契約,AbstractMap 縮減樣板代碼。
  • SortedMap 引入順序,NavigableMap 賦能導航與範圍操作。
  • TreeMap 是唯一同時實現 NavigableMap、SortedMap、Map 的標準實現,基於紅黑樹保證 O(log n) 操作複雜度。
  • HashMap 以 O(1) 平均複雜度服務海量無序場景,JDK 8 引入紅黑樹退化防禦。
  • 理解接口層次有助於面向接口編程:聲明類型用 Map/SortedMap/NavigableMap,具體實現類在構造時注入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved