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
floorEntry
、ceilingEntry
和 higherEntry
分別返回與小於、小於等於、大於等於、大於給定鍵的鍵關聯的 Map.Entry
物件,如果不存在這樣的鍵,則返回null
。類似地,方法lowerKey
、floorKey
、ceilingKey
和higherKey
只返回關聯的鍵。所有這些方法是為查詢條目而不是遍歷條目而設計的。
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來實現對鍵值的操作。