天天看點

【轉】Java 集合系列09之 Map架構

概要

前面,我們已經系統的對List進行了學習。接下來,我們先學習Map,然後再學習Set;因為Set的實作類都是基于Map來實作的(如,HashSet是通過HashMap實作的,TreeSet是通過TreeMap實作的)。

首先,我們看看Map架構。

【轉】Java 集合系列09之 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的内容也是“鍵值對,也不保證次序”。但和HashMap相比,Hashtable是線程安全的,而且它支援通過Enumeration去周遊。

(08) WeakHashMap 繼承于AbstractMap。它和HashMap的鍵類型不同,WeakHashMap的鍵是“弱鍵”。

在對各個實作類進行詳細之前,先來看看各個接口和抽象類的大緻介紹。内容包括:

1 Map

2 Map.Entry

3 AbstractMap

4 SortedMap

5 NavigableMap

6 Dictionary

轉載請注明出處:http://www.cnblogs.com/skywang12345/p/3308931.html

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提供了“鍵-值對”、“根據鍵擷取值”、“删除鍵”、“擷取容量大小”等方法。

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)      

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()      

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)      

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類,擷取鍵-值對的子集。

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()