Java 集合系列09之 Map架構
概要
前面,我們已經系統的對List進行了學習。接下來,我們先學習Map,然後再學習Set;因為Set的實現類都是基於Map來實現的(如,HashSet是通過HashMap實現的,TreeSet是通過TreeMap實現的)。
首先,我們看看Map架構。
如上圖:
(01) Map 是對映介面,Map中儲存的內容是鍵值對(key-value)。
(02) AbstractMap 是繼承於Map的抽象類,它實現了Map中的大部分API。其它Map的實現類可以通過繼承AbstractMap來減少重複編碼。
(03) SortedMap 是繼承於Map的介面。SortedMap中的內容是排序的鍵值對,排序的方法是通過比較器(Comparator)。
(04) NavigableMap 是繼承於SortedMap的介面。相比於SortedMap,NavigableMap有一系列的導航方法;如"獲取大於/等於某物件的鍵值對"、“獲取小於/等於某物件的鍵值對”等等。
(05) TreeMap 繼承於AbstractMap,且實現了NavigableMap介面;因此,TreeMap中的內容是“有序的鍵值對”!
(06) HashMap 繼承於AbstractMap,但沒實現NavigableMap介面;因此,HashMap的內容是“鍵值對,但不保證次序”!
(07) Hashtable 雖然不是繼承於AbstractMap,但它繼承於Dictionary(Dictionary也是鍵值對的介面),而且也實現Map介面;因此,Hashtable的內容也是“鍵值對,也不保證次序
(08) WeakHashMap 繼承於AbstractMap。它和HashMap的鍵型別不同,WeakHashMap的鍵是“弱鍵”。
1 Map
Map的定義如下:
public interface Map<K,V> { }
Map 是一個鍵值對(key-value)對映介面。Map對映中不能包含重複的鍵;每個鍵最多隻能對映到一個值。
Map 介面提供三種collection 檢視,允許以鍵集、值集或鍵-值映射關係集的形式檢視某個對映的內容。
Map 對映順序。有些實現類,可以明確保證其順序,如 TreeMap;另一些對映實現則不保證順序,如 HashMap 類。
Map 的實現類應該提供2個“標準的”構造方法:第一個,void(無引數)構造方法,用於建立空對映;第二個,帶有單個 Map 型別引數的構造方法,用於建立一個與其引數具有相同鍵-值對映關係的新對映。實際上,後一個構造方法允許使用者複製任意對映,生成所需類的一個等價對映。儘管無法強制執行此建議(因為介面不能包含構造方法),但是 JDK 中所有通用的對映實現都遵從它。
Map的API
abstract void clear()
abstract boolean containsKey(Object key)
abstract boolean containsValue(Object value)
abstract Set<Entry<K, V>> entrySet()
abstract boolean equals(Object object)
abstract V get(Object key)
abstract int hashCode()
abstract boolean isEmpty()
abstract Set<K> keySet()
abstract V put(K key, V value)
abstract void putAll(Map<? extends K, ? extends V> map)
abstract V remove(Object key)
abstract int size()
abstract Collection<V> values()
說明:
(01) Map提供介面分別用於返回 鍵集、值集或鍵-值對映關係集。
entrySet()用於返回鍵-值集的Set集合
keySet()用於返回鍵集的Set集合
values()使用者返回值集的Collection集合
因為Map中不能包含重複的鍵;每個鍵最多隻能對映到一個值。所以,鍵-值集、鍵集都是Set,值集時Collection。
(02) Map提供了“鍵-值對”、“根據鍵獲取值”、“刪除鍵”、“獲取容量大小”等方法。
2 Map.Entry
Map.Entry的定義如下:
interface Entry<K,V> { }
Map.Entry是Map中內部的一個介面,Map.Entry是鍵值對,Map通過 entrySet() 獲取Map.Entry的鍵值對集合,從而通過該集合實現對鍵值對的操作。
Map.Entry的API
abstract boolean equals(Object object)
abstract K getKey()
abstract V getValue()
abstract int hashCode()
abstract V setValue(V object)
3 AbstractMap
AbstractMap的定義如下:
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 方法。
AbstractMap的API
abstract Set<Entry<K, V>> entrySet()
void clear()
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean equals(Object object)
V get(Object key)
int hashCode()
boolean isEmpty()
Set<K> keySet()
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> map)
V remove(Object key)
int size()
String toString()
Collection<V> values()
Object clone()
4 SortedMap
SortedMap的定義如下:
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 型別引數的構造方法,它建立一個新的有序對映,其鍵-值對映關係和排序方法與輸入的有序對映相同。無法保證強制實施此建議,因為介面不能包含構造方法。
SortedMap的API
// 繼承於Map的API
abstract void clear()
abstract boolean containsKey(Object key)
abstract boolean containsValue(Object value)
abstract Set<Entry<K, V>> entrySet()
abstract boolean equals(Object object)
abstract V get(Object key)
abstract int hashCode()
abstract boolean isEmpty()
abstract Set<K> keySet()
abstract V put(K key, V value)
abstract void putAll(Map<? extends K, ? extends V> map)
abstract V remove(Object key)
abstract int size()
abstract Collection<V> values()
// SortedMap新增的API
abstract Comparator<? super K> comparator()
abstract K firstKey()
abstract SortedMap<K, V> headMap(K endKey)
abstract K lastKey()
abstract SortedMap<K, V> subMap(K startKey, K endKey)
abstract SortedMap<K, V> tailMap(K startKey)
5 NavigableMap
NavigableMap的定義如下:
public interface NavigableMap<K,V> extends SortedMap<K,V> { }
NavigableMap是繼承於SortedMap的介面。它是一個可導航的鍵-值對集合,具有了為給定搜尋目標報告最接近匹配項的導航方法。
NavigableMap分別提供了獲取“鍵”、“鍵-值對”、“鍵集”、“鍵-值對集”的相關方法。
NavigableMap的API
abstract Entry<K, V> ceilingEntry(K key)
abstract Entry<K, V> firstEntry()
abstract Entry<K, V> floorEntry(K key)
abstract Entry<K, V> higherEntry(K key)
abstract Entry<K, V> lastEntry()
abstract Entry<K, V> lowerEntry(K key)
abstract Entry<K, V> pollFirstEntry()
abstract Entry<K, V> pollLastEntry()
abstract K ceilingKey(K key)
abstract K floorKey(K key)
abstract K higherKey(K key)
abstract K lowerKey(K key)
abstract NavigableSet<K> descendingKeySet()
abstract NavigableSet<K> navigableKeySet()
abstract NavigableMap<K, V> descendingMap()
abstract NavigableMap<K, V> headMap(K toKey, boolean inclusive)
abstract SortedMap<K, V> headMap(K toKey)
abstract SortedMap<K, V> subMap(K fromKey, K toKey)
abstract NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
abstract SortedMap<K, V> tailMap(K fromKey)
abstract NavigableMap<K, V> tailMap(K fromKey, boolean inclusive)
說明:
NavigableMap除了繼承SortedMap的特性外,它的提供的功能可以分為4類:
第1類,提供操作鍵-值對的方法。
lowerEntry、floorEntry、ceilingEntry 和 higherEntry 方法,它們分別返回與小於、小於等於、大於等於、大於給定鍵的鍵關聯的 Map.Entry 物件。
firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 方法,它們返回和/或移除最小和最大的對映關係(如果存在),否則返回 null。
第2類,提供操作鍵的方法。這個和第1類比較類似
lowerKey、floorKey、ceilingKey 和 higherKey 方法,它們分別返回與小於、小於等於、大於等於、大於給定鍵的鍵。
第3類,獲取鍵集。
navigableKeySet、descendingKeySet分別獲取正序/反序的鍵集。
第4類,獲取鍵-值對的子集。
6 Dictionary
Dictionary的定義如下:
public abstract class Dictionary<K,V> {}
NavigableMap是JDK 1.0定義的鍵值對的介面,它也包括了操作鍵值對的基本函式。
Dictionary的API
abstract Enumeration<V> elements()
abstract V get(Object key)
abstract boolean isEmpty()
abstract Enumeration<K> keys()
abstract V put(K key, V value)
abstract V remove(Object key)
abstract int size()