abstract:概要前面,我們已經(jīng)系統(tǒng)的對List進(jìn)行了學(xué)習(xí)。接下來,我們先學(xué)習(xí)Map,然后再學(xué)習(xí)Set;因為Set的實現(xiàn)類都是基于Map來實現(xiàn)的(如,HashSet是通過HashMap實現(xiàn)的,TreeSet是通過TreeMap實現(xiàn)的)。首先,我們看看Map架構(gòu)。如上圖:(01) Map 是映射接口,Map中存儲的內(nèi)容是鍵值對(key-value)。(02) AbstractMap 是繼承于Map的抽象類,它實現(xiàn)
概要
前面,我們已經(jīng)系統(tǒng)的對List進(jìn)行了學(xué)習(xí)。接下來,我們先學(xué)習(xí)Map,然后再學(xué)習(xí)Set;因為Set的實現(xiàn)類都是基于Map來實現(xiàn)的(如,HashSet是通過HashMap實現(xiàn)的,TreeSet是通過TreeMap實現(xiàn)的)。
首先,我們看看Map架構(gòu)。
如上圖:
(01) Map 是映射接口,Map中存儲的內(nèi)容是鍵值對(key-value)。
(02) AbstractMap 是繼承于Map的抽象類,它實現(xiàn)了Map中的大部分API。其它Map的實現(xiàn)類可以通過繼承AbstractMap來減少重復(fù)編碼。
(03) SortedMap 是繼承于Map的接口。SortedMap中的內(nèi)容是排序的鍵值對,排序的方法是通過比較器(Comparator)。
(04) NavigableMap 是繼承于SortedMap的接口。相比于SortedMap,NavigableMap有一系列的導(dǎo)航方法;如"獲取大于/等于某對象的鍵值對"、“獲取小于/等于某對象的鍵值對”等等。
(05) TreeMap 繼承于AbstractMap,且實現(xiàn)了NavigableMap接口;因此,TreeMap中的內(nèi)容是“有序的鍵值對”!
(06) HashMap 繼承于AbstractMap,但沒實現(xiàn)NavigableMap接口;因此,HashMap的內(nèi)容是“鍵值對,但不保證次序”!
(07) Hashtable 雖然不是繼承于AbstractMap,但它繼承于Dictionary(Dictionary也是鍵值對的接口),而且也實現(xiàn)Map接口;因此,Hashtable的內(nèi)容也是“鍵值對,也不保證次序”。但和HashMap相比,Hashtable是線程安全的,而且它支持通過Enumeration去遍歷。
(08) WeakHashMap 繼承于AbstractMap。它和HashMap的鍵類型不同,WeakHashMap的鍵是“弱鍵”。
在對各個實現(xiàn)類進(jìn)行詳細(xì)之前,先來看看各個接口和抽象類的大致介紹。內(nèi)容包括:
1 Map
2 Map.Entry
3 AbstractMap
4 SortedMap
5 NavigableMap
6 Dictionary
1 Map
Map的定義如下:
public interface Map<K,V> { }
Map 是一個鍵值對(key-value)映射接口。Map映射中不能包含重復(fù)的鍵;每個鍵最多只能映射到一個值。
Map 接口提供三種collection 視圖,允許以鍵集、值集或鍵-值映射關(guān)系集的形式查看某個映射的內(nèi)容。
Map 映射順序。有些實現(xiàn)類,可以明確保證其順序,如 TreeMap;另一些映射實現(xiàn)則不保證順序,如 HashMap 類。
Map 的實現(xiàn)類應(yīng)該提供2個“標(biāo)準(zhǔn)的”構(gòu)造方法:第一個,void(無參數(shù))構(gòu)造方法,用于創(chuàng)建空映射;第二個,帶有單個 Map 類型參數(shù)的構(gòu)造方法,用于創(chuàng)建一個與其參數(shù)具有相同鍵-值映射關(guān)系的新映射。實際上,后一個構(gòu)造方法允許用戶復(fù)制任意映射,生成所需類的一個等價映射。盡管無法強(qiáng)制執(zhí)行此建議(因為接口不能包含構(gòu)造方法),但是 JDK 中所有通用的映射實現(xiàn)都遵從它。
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提供接口分別用于返回 鍵集、值集或鍵-值映射關(guān)系集。
entrySet()用于返回鍵-值集的Set集合
keySet()用于返回鍵集的Set集合
values()用戶返回值集的Collection集合
因為Map中不能包含重復(fù)的鍵;每個鍵最多只能映射到一個值。所以,鍵-值集、鍵集都是Set,值集時Collection。
(02) Map提供了“鍵-值對”、“根據(jù)鍵獲取值”、“刪除鍵”、“獲取容量大小”等方法。
2 Map.Entry
Map.Entry的定義如下:
interface Entry<K,V> { }
Map.Entry是Map中內(nèi)部的一個接口,Map.Entry是鍵值對,Map通過 entrySet() 獲取Map.Entry的鍵值對集合,從而通過該集合實現(xiàn)對鍵值對的操作。
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 接口的骨干實現(xiàn),以最大限度地減少實現(xiàn)此接口所需的工作。
要實現(xiàn)不可修改的映射,編程人員只需擴(kuò)展此類并提供 entrySet 方法的實現(xiàn)即可,該方法將返回映射的映射關(guān)系 set 視圖。通常,返回的 set 將依次在 AbstractSet 上實現(xiàn)。此 set 不支持 add() 或 remove() 方法,其迭代器也不支持 remove() 方法。
要實現(xiàn)可修改的映射,編程人員必須另外重寫此類的 put 方法(否則將拋出 UnsupportedOperationException),entrySet().iterator() 返回的迭代器也必須另外實現(xiàn)其 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 的所有元素都必須實現(xiàn) Comparable 接口(或者被指定的比較器所接受)。
另外,所有SortedMap 實現(xiàn)類都應(yīng)該提供 4 個“標(biāo)準(zhǔn)”構(gòu)造方法:
(01) void(無參數(shù))構(gòu)造方法,它創(chuàng)建一個空的有序映射,按照鍵的自然順序進(jìn)行排序。
(02) 帶有一個 Comparator 類型參數(shù)的構(gòu)造方法,它創(chuàng)建一個空的有序映射,根據(jù)指定的比較器進(jìn)行排序。
(03) 帶有一個 Map 類型參數(shù)的構(gòu)造方法,它創(chuàng)建一個新的有序映射,其鍵-值映射關(guān)系與參數(shù)相同,按照鍵的自然順序進(jìn)行排序。
(04) 帶有一個 SortedMap 類型參數(shù)的構(gòu)造方法,它創(chuàng)建一個新的有序映射,其鍵-值映射關(guān)系和排序方法與輸入的有序映射相同。無法保證強(qiáng)制實施此建議,因為接口不能包含構(gòu)造方法。
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的接口。它是一個可導(dǎo)航的鍵-值對集合,具有了為給定搜索目標(biāo)報告最接近匹配項的導(dǎo)航方法。
NavigableMap分別提供了獲取“鍵”、“鍵-值對”、“鍵集”、“鍵-值對集”的相關(guān)方法。
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 方法,它們分別返回與小于、小于等于、大于等于、大于給定鍵的鍵關(guān)聯(lián)的 Map.Entry 對象。
firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 方法,它們返回和/或移除最小和最大的映射關(guān)系(如果存在),否則返回 null。
第2類,提供操作鍵的方法。這個和第1類比較類似
lowerKey、floorKey、ceilingKey 和 higherKey 方法,它們分別返回與小于、小于等于、大于等于、大于給定鍵的鍵。
第3類,獲取鍵集。
navigableKeySet、descendingKeySet分別獲取正序/反序的鍵集。
第4類,獲取鍵-值對的子集。
6 Dictionary
Dictionary的定義如下:
public abstract class Dictionary<K,V> {}
NavigableMap是JDK 1.0定義的鍵值對的接口,它也包括了操作鍵值對的基本函數(shù)。
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()