Map架構分析

轉自:


Map 是映射接口,Map中存儲的內容是鍵值對(key-value)
AbstractMap 是繼承於Map的抽象類,它實現了Map中的大部分API。其它Map的實現類可以通過繼承AbstractMap來減少重複編碼。
SortedMap 是繼承於Map的接口。SortedMap中的內容是排序的鍵值對,排序的方法是通過比較器(Comparator)。
NavigableMap 是繼承於SortedMap的接口。相比於SortedMap,NavigableMap有一系列的導航方法;如"獲取大於/等於某對象的鍵值對"、“獲取小於/等於某對象的鍵值對”等等。 
TreeMap 繼承於AbstractMap,且實現了NavigableMap接口;因此,TreeMap中的內容是“有序的鍵值對”!
HashMap 繼承於AbstractMap,但沒實現NavigableMap接口;因此,HashMap的內容是“鍵值對,但不保證次序”!
Hashtable 雖然不是繼承於AbstractMap,但它繼承於Dictionary(Dictionary也是鍵值對的接口),而且也實現Map接口;因此,Hashtable的內容也是“鍵值對,也不保證次序”。但和HashMap相比,Hashtable是線程安全的,而且它支持通過Enumeration去遍歷。
WeakHashMap 繼承於AbstractMap。它和HashMap的鍵類型不同,WeakHashMap的鍵是“弱鍵”

 

有了上面的總體框架之後,我們先來看看各個接口和抽象類的介紹;後面再對各個實現類進行詳細說明


Map的定義如下:

  1. public interface Map<K,V> { } 

Map 是一個鍵值對(key-value)映射接口。Map映射中不能包含重複的鍵;每個鍵最多隻能映射到一個值
Map 接口提供三種collection 視圖,允許以鍵集值集鍵-值映射關係集的形式查看某個映射的內容。
Map 映射順序。有些實現類,可以明確保證其順序,如 TreeMap;另一些映射實現則不保證順序,如 HashMap 類。
Map 的實現類應該提供2個“標準的”構造方法:第一個,void(無參數)構造方法,用於創建空映射第二個,帶有單個 Map 類型參數的構造方法,用於創建一個與其參數具有相同鍵-值映射關係的新映射。實際上,後一個構造方法允許用戶複製任意映射,生成所需類的一個等價映射。儘管無法強制執行此建議(因爲接口不能包含構造方法),但是 JDK 中所有通用的映射實現都遵從它。


(01) Map提供接口分別用於返回 鍵集、值集或鍵-值映射關係集。
        entrySet()用於返回鍵-值集Set集合
        keySet()用於返回鍵集Set集合
       values()用戶返回值集Collection集合
       因爲Map中不能包含重複的鍵;每個鍵最多隻能映射到一個值。所以,鍵-值集、鍵集都是Set,值集時Collection

(02) Map提供了“鍵-值對”、“根據鍵獲取值”、“刪除鍵”、“獲取容量大小”等方法。

2 Map.Entry

Map.Entry的定義如下:

  1. interface Entry<K,V> { }  

Map.Entry是Map中內部的一個接口,Map.Entry是鍵值對,Map通過 entrySet() 獲取Map.Entry的鍵值對集合,從而通過該集合實現對鍵值對的操作。

Map.Entry的API

  1. abstract boolean     equals(Object object)  
  2. abstract K             getKey()  
  3. abstract V             getValue()  
  4. abstract int         hashCode()  
  5. abstract V             setValue(V object) 

3 AbstractMap

AbstractMap的定義如下:

  1. public abstract class AbstractMap<K,V> implements Map<K,V> {} 

AbstractMap類提供 Map 接口的骨幹實現,以最大限度地減少實現此接口所需的工作。
要實現不可修改的映射,編程人員只需擴展此類並提供 entrySet 方法的實現即可,該方法將返回映射的映射關係 set 視圖。通常,返回的 set 將依次在 AbstractSet 上實現。此 set 不支持 add() 或 remove() 方法,其迭代器也不支持 remove() 方法。

要實現可修改的映射,編程人員必須另外重寫此類的 put 方法(否則將拋出 UnsupportedOperationException),entrySet().iterator() 返回的迭代器也必須另外實現其 remove 方法。


4 SortedMap

SortedMap的定義如下:

  1. public interface SortedMap<K,V> extends Map<K,V> { } 

SortedMap是一個繼承於Map接口的接口。它是一個有序的SortedMap鍵值映射。
SortedMap的排序方式有兩種:自然排序 或者 用戶指定比較器。 插入有序 SortedMap 的所有元素都必須實現 Comparable 接口(或者被指定的比較器所接受)。

另外,所有SortedMap 實現類都應該提供 4 個“標準”構造方法:
(01) void(無參數)構造方法,它創建一個空的有序映射,按照鍵的自然順序進行排序。
(02) 帶有一個 Comparator 類型參數的構造方法,它創建一個空的有序映射,根據指定的比較器進行排序。
(03) 帶有一個 Map 類型參數的構造方法,它創建一個新的有序映射,其鍵-值映射關係與參數相同,按照鍵的自然順序進行排序。
(04) 帶有一個 SortedMap 類型參數的構造方法,它創建一個新的有序映射,其鍵-值映射關係和排序方法與輸入的有序映射相同。無法保證強制實施此建議,因爲接口不能包含構造方法。

5 NavigableMap

NavigableMap的定義如下:

  1. public interface NavigableMap<K,V> extends SortedMap<K,V> { } 

NavigableMap是繼承於SortedMap的接口。它是一個可導航的鍵-值對集合,具有了爲給定搜索目標報告最接近匹配項的導航方法。
NavigableMap分別提供了獲取“鍵”、“鍵-值對”、“鍵集”、“鍵-值對集”的相關方法。

說明

NavigableMap除了繼承SortedMap的特性外,它的提供的功能可以分爲4類:
第1類,提供操作鍵-值對的方法。
               lowerEntryfloorEntryceilingEntry 和 higherEntry 方法,它們分別返回與小於、小於等於、大於等於、大於給定鍵的鍵關聯的 Map.Entry 對象。
               firstEntrypollFirstEntrylastEntry 和 pollLastEntry 方法,它們返回和/或移除最小和最大的映射關係(如果存在),否則返回 null。
第2類,提供操作鍵的方法。這個和第1類比較類似
               lowerKeyfloorKeyceilingKey 和 higherKey 方法,它們分別返回與小於、小於等於、大於等於、大於給定鍵的鍵。
第3類,獲取鍵集。
              navigableKeySetdescendingKeySet分別獲取正序/反序的鍵集。
第4類,獲取鍵-值對的子集。

6 Dictionary

Dictionary的定義如下:

  1. public abstract class Dictionary<K,V> {} 

NavigableMap是JDK 1.0定義的鍵值對的接口,它也包括了操作鍵值對的基本函數。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章