欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Java集合框架---Map

Map

 


Map
接口不是Collection接口的繼承。Map接口用于維護鍵/值對(key/value pairs)。該接口描述了從不重復的鍵到值的映射。Map 接口提供三種collection 視圖,允許以鍵集、值集合或鍵-值映射關(guān)系集的形式查看某個(gè)映射的內容:

 

Set keySet(): 返回映像中所有關(guān)鍵字的視圖集

Collection values():返回映像中所有值的視圖集

Set entrySet(): 返回Map.Entry對象的視圖集,即映像中的關(guān)鍵字/值對

 

獲得的對應集合可以刪除,但是不可以添加。

 

Map.Entry接口

MapentrySet()方法返回一個(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

和其它抽象集合實(shí)現相似,AbstractMap 類(lèi)覆蓋了equals()hashCode()方法以確保兩個(gè)相等映射返回相同的哈希碼。
 

HashMap類(lèi)和TreeMap類(lèi)

Map 插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會(huì )更好。使用HashMap要求添加的鍵類(lèi)明確定義了hashCode()equals()的實(shí)現。
 

由于TreeMap它底層采用一棵“紅黑樹(shù)”來(lái)保存集合中的 Entry,這意味這 TreeMap 添加元素、取出元素的性能都比 HashMap OlgN:當 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; 
 }

 

HashMapHashTable

Hashtable和HashMap類(lèi)有三個(gè)重要的不同之處。第一個(gè)不同主要是歷史原因。Hashtable是基于陳舊的Dictionary類(lèi)的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現。
  
  也許最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。這就意味著(zhù),雖然你可以不用采取任何特殊的行為就可以在一個(gè)多線(xiàn)程的應用程序中用一個(gè)Hashtable,但你必須同樣地為一個(gè)HashMap提供外同步。一個(gè)方便的方法就是利用Collections類(lèi)的靜態(tài)的synchronizedMap()方法,它創(chuàng )建一個(gè)線(xiàn)程安全的Map對象,并把它作為一個(gè)封裝的對象來(lái)返回。這個(gè)對象的方法可以讓你同步訪(fǎng)問(wèn)潛在的HashMap。這么做的結果就是當你不需要同步時(shí),你不能切斷Hashtable中的同步(比如在一個(gè)單線(xiàn)程的應用程序中),而且同步增加了很多處理費用。
  
  第三點(diǎn)不同是,只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value。HashMap中只有一條記錄可以是一個(gè)空的key,但任意數量的條目可以是空的value。這就是說(shuō),如果在表中沒(méi)有發(fā)現搜索鍵,或者如果發(fā)現了搜索鍵,但它是一個(gè)空的值,那么get()將返回null。如果有必要,用containKey()方法來(lái)區別這兩種情況。 

 

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 HashSetHashMap關(guān)系之源碼分析

 

 

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Map、Set、Iterator迭代詳解與Java平臺的集合框架
java 容器類(lèi)使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的區別
List的功能方法
【java讀書(shū)筆記】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)
集合框架中的map接口的使用
專(zhuān)業(yè)技術(shù)帖!Java程序員面試常見(jiàn)問(wèn)題及答案
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久