1. 程式人生 > >java原始碼分析之集合框架Map 07

java原始碼分析之集合框架Map 07

Map  概覽:


 1. Map是一個介面,Map中儲存的內容是鍵值對(key-value)

        2. 為了方便,我們抽象出AbstractMap類來讓其他類繼承,該類實現了Map中的大部分API,其他Map的具體實現就可以通過直接繼承AbatractMap類即可。查詢API文件可以知道AbstractMap比Map介面多了兩個方法(除了AbstractMap繼承Object的方法

clone()
          返回此 AbstractMap

例項的淺表副本:不復制鍵和值本身。

toString()
          返回此對映的字串表示形式。


  3. SortedMap也是一個介面,它繼承與Map介面。SortedMap中的內容與Map中的區別在於,它是有序的鍵值對,裡面排序的方法是通過比較器(Comparator)實現的。

 4. NavigableMap也是一個介面,它繼承與SortedMap介面,所以它肯定也是有序的,另外,NavigableMap還有一些導航的方法:lowerEntry

floorEntryceilingEntryhigherEntry 分別返回與小於、小於等於、大於等於、大於給定鍵的鍵關聯的 Map.Entry 物件,如果不存在這樣的鍵,則返回null。類似地,方法lowerKeyfloorKeyceilingKeyhigherKey 只返回關聯的鍵。所有這些方法是為查詢條目而不是遍歷條目而設計的。 

 5. 再往下就是具體實現類了,TreeMap繼承與AbstractMap,同時實現了NavigableMap介面。因此,TreeMap中的內容是有序鍵值對

 6. HashMap僅僅是繼承了AbstractMap,並沒有實現NavigableMap介面。因此,HashMap的內容僅是鍵值對而已,不保證有序

  7. WeakHashMap也是僅僅繼承了AbstractMap,它和HashMap的區別是鍵型別不同,WeakHashMap的鍵是弱鍵

  8. HashTable雖然不是繼承與AbstractMap,但是它繼承與Dictionary(Dictionary也是鍵值對的介面),而且也實現了Map介面。因此,HashTable的內容也是鍵值對,且不保證順序。但是和HashMap相比,HashTable是執行緒安全的,而且它支援通過Enumeration去遍歷。



map:

package java.util;  
  
public interface Map<K,V> {  
    boolean isEmpty();  
    boolean containsKey(Object key);  
    boolean containsValue(Object value);  
    V get(Object key);  
    V put(K key, V value);  
    V remove(Object key);  
    void putAll(Map<? extends K, ? extends V> m);  
    void clear();  
    Set<K> keySet(); //儲存key的Set  
    Collection<V> values(); //儲存value的Collection  
    Set<Map.Entry<K, V>> entrySet(); //儲存Map.Entry的Set  
    interface Entry<K,V> { //Map內部的一個介面,Entry中封裝了key和value資訊  
        K getKey();  
        V getValue();  
        V setValue(V value);  
        boolean equals(Object o);  
        int hashCode();  
    }  
    boolean equals(Object o);  
    int hashCode();  
  
}  
  由上面的原始碼可知:

    1. Map提供了一些介面分別用於返回鍵集、值集以及鍵值對映關係集。

        keySet()用於返回鍵的Set集合;

        values()用於返回值的Set集合;

        entrySet()用於返回鍵值集的Set集合,鍵值資訊封裝在Entry中。

    2. Map還對外提供了“獲取鍵”、“根據鍵獲取值”、“是否包含某個鍵或值”等等方法。

    3. Map.Entry是Map內部的一個介面,Map.Entry是一個鍵值對,我們要想獲取Map中的Map中的鍵值對,可以通過Map.entrySet()來獲取,獲取到的是一個裝著Map.Entry的集合,然後可以通過這個Entry來實現對鍵值的操作。