Map

Set keySet(): 返回映像中所有關(guān)鍵字的視圖集
Collection values():返回映像中所有值的視圖集
Set entrySet(): 返回Map.Entry對象的視圖集,即映像中的關(guān)鍵字/值對
獲得的對應集合可以刪除,但是不可以添加。
Map.Entry接口
Map的entrySet()方法返回一個(gè)實(shí)現Map.Entry接口的對象集合。集合中每個(gè)對象都是底層Map中一個(gè)特定的鍵/值對。
通過(guò)這個(gè)集合的迭代器,您可以獲得每一個(gè)條目(唯一獲取方式)的鍵或值并對值進(jìn)行更改。當條目通過(guò)迭代器返回后,除非是迭代器自身的remove()方法或者迭代器返回的條目的setValue()方法,其余對源Map外部的修改都會(huì )導致此條目集變得無(wú)效,同時(shí)產(chǎn)生條目行為未定義。
SortedMap接口
SortedMap接口為映像的視圖(子集),包括兩個(gè)端點(diǎn)提供了訪(fǎng)問(wèn)方法。除了排序是作用于映射的鍵以外,處理SortedMap和處理SortedSet一樣?! ?/span>
添加到SortedMap實(shí)現類(lèi)的元素必須實(shí)現Comparable接口,否則您必須給它的構造函數提供一個(gè)Comparator接口的實(shí)現。TreeMap類(lèi)是它的唯一一份實(shí)現。
AbstractMap
HashMap類(lèi)和TreeMap類(lèi)
由于TreeMap它底層采用一棵“紅黑樹(shù)”來(lái)保存集合中的 Entry,這意味這 TreeMap 添加元素、取出元素的性能都比 HashMap 低O(lgN):當 TreeMap 添加元素時(shí),需要通過(guò)循環(huán)找到新增 Entry 的插入位置,因此比較耗性能;當從 TreeMap 中取出元素時(shí),需要通過(guò)循環(huán)才能找到合適的 Entry,也比較耗性能。但 TreeMap、TreeSet 比 HashMap、HashSet 的優(yōu)勢在于:TreeMap 中的所有 Entry 總是按 key 根據指定排序規則保持有序狀態(tài),TreeSet 中所有元素總是根據指定排序規則保持有序狀態(tài),對排序二叉樹(shù),若按中序遍歷就可以得到由小到大的有序序列。
《樹(shù)和二叉樹(shù)》
《各種其他樹(shù)》
通過(guò)分析 JDK 源代碼研究 TreeMap 紅黑樹(shù)算法實(shí)現
TreeMap對鍵按序存放,因此它便有一些擴展的方法,比如firstKey(),lastKey()等。TreeMap采用紅-黑樹(shù)的二叉搜索樹(shù)來(lái)保存Map中每一個(gè)Entry,每個(gè)Entery都被當成“紅黑樹(shù)”的一個(gè)節點(diǎn)。
public static void main(String[] args)
{ TreeMap<String,Object> treeMap = new TreeMap<String,Object>();
treeMap.put("004", new Integer(40));
treeMap.put("003", new Integer(30));
treeMap.put("001", new Integer(10));
treeMap.put("002", new Integer(20));
}
{001=10, 002=20, 003=30, 004=40}
getEntry()源碼:
final Entry<K,V> getEntry(Object key) { // 如果 comparator 不為 null,表明程序采用定制排序
if (comparator != null) // 調用 getEntryUsingComparator 方法來(lái)取出對應的 key
return getEntryUsingComparator(key); // 如果 key 形參的值為 null,拋出 NullPointerException 異常
if (key == null) throw new NullPointerException(); // 將 key 強制類(lèi)型轉換為 Comparable 實(shí)例
Comparable<? super K> k = (Comparable<? super K>) key; // 從樹(shù)的根節點(diǎn)開(kāi)始 Entry<K,V> p = root; while (p != null) { // 拿 key 與當前節點(diǎn)的 key 進(jìn)行比較
int cmp = k.compareTo(p.key); // 如果 key 小于當前節點(diǎn)的 key,向“左子樹(shù)”搜索
if (cmp < 0) p = p.left; // 如果 key 大于當前節點(diǎn)的 key,向“右子樹(shù)”搜索
else if (cmp > 0) p = p.right; // 不大于、不小于,就是找到了目標 Entry
else return p; } return null; }
HashMap和HashTable
LinkedHashMap
擴展HashMap,以插入順序將關(guān)鍵字/值對添加進(jìn)鏈接哈希映像中。象LinkedHashSet一樣,LinkedHashMap內部也采用雙重鏈接式列表。所以迭代順序也就是插入順序。
WeakHashMap
它使用WeakReference(弱引用)來(lái)存放哈希表關(guān)鍵字。使用這種方式時(shí),當映射的鍵在 WeakHashMap 的外部不再被引用時(shí),垃圾收集器會(huì )將它回收,但它將把到達該對象的弱引用納入一個(gè)隊列。WeakHashMap的運行將定期檢查該隊列,以便找出新到達的弱應用。當一個(gè)弱引用到達該隊列時(shí),就表示關(guān)鍵字不再被任何人使用,并且它已經(jīng)被收集起來(lái)。然后WeakHashMap便刪除相關(guān)的映射。
IdentityHashMap
這個(gè)類(lèi)中,關(guān)鍵字的哈希碼不應該由hashCode()方法來(lái)計算,而應該由System.identityHashCode方法進(jìn)行計算(即使已經(jīng)重新定義了hashCode方法)。這是Object.hashCode根據對象的內存地址來(lái)計算哈希碼時(shí)使用的方法。另外,為了對各個(gè)對象進(jìn)行比較,IdentityHashMap將使用==,而不使用equals方法。
換句話(huà)說(shuō),不同的關(guān)鍵字對象,即使它們的內容相同,也被視為不同的對象。IdentityHashMap類(lèi)可以用于實(shí)現對象拓撲結構轉換(topology-preserving object graph transformations)(比如實(shí)現對象的串行化或深度拷貝),在進(jìn)行轉換時(shí),需要一個(gè)“節點(diǎn)表”跟蹤那些已經(jīng)處理過(guò)的對象的引用。即使碰巧有對象相等,“節點(diǎn)表”也不應視其相等。另一個(gè)應用是維護代理對象。比如,調試工具希望在程序調試期間維護每個(gè)對象的一個(gè)代理對象。
“IdentityHashMap類(lèi)不是一般意義的Map實(shí)現!它的實(shí)現有意的違背了Map接口要求通過(guò)equals方法比較對象的約定。這個(gè)類(lèi)僅使用在很少發(fā)生的需要強調等同性語(yǔ)義的情況。”
http://a123159521.javaeye.com/blog/693225 HashMap源碼解析
http://www.javaeye.com/topic/340756 HashSet與HashMap關(guān)系之源碼分析
聯(lián)系客服