Java™ 教程(Map實現)

Map實現

Map實現分爲通用、專用和併發實現。html

通用Map實現

三種通用Map實現是HashMapTreeMapLinkedHashMap。若是須要SortedMap操做或鍵順序的集合視圖迭代,請使用TreeMap;若是你想要最大速度而且不關心迭代順序,請使用HashMap;若是要得到近乎HashMap的性能和插入順序迭代,請使用LinkedHashMap。在這方面,Map的狀況相似於Setjava

LinkedHashMap提供了LinkedHashSet不具有的兩種功能,建立LinkedHashMap時,能夠基於鍵訪問而不是插入對其進行排序,換句話說,僅查找與鍵關聯的值會將鍵帶到Map的末尾。另外,LinkedHashMap提供了removeEldestEntry方法,當將新映射添加到Map時,能夠重寫該方法以強加一個策略來自動刪除陳舊的映射,這使得實現自定義緩存很是容易。segmentfault

例如,此重寫將使Map最多能夠擴展到100個條目,而後每次添加新條目時都會刪除最舊的條目,從而保持100個條目的穩定狀態。api

private static final int MAX\_ENTRIES = 100;

protected boolean removeEldestEntry(Map.Entry eldest) {
    return size() > MAX_ENTRIES;
}

專用Map實現

有三種特殊的Map實現 — EnumMapWeakHashMapIdentityHashMapEnumMap在內部實現爲數組,是一種用於枚舉鍵的高性能Map實現,此實現將Map接口的豐富性和安全性與接近數組的速度結合在一塊兒,若是要將枚舉映射到值,則應始終使用EnumMap優先於數組。數組

WeakHashMapMap接口的實現,它只存儲對其鍵的弱引用,僅存儲弱引用時,若是再也不在WeakHashMap以外引用其鍵,則能夠對鍵值對進行垃圾回收。此類提供了利用弱引用功能的最簡單方法,這對於實現「相似註冊表」的數據結構頗有用,在該結構中,當某個條目的鍵再也不被任何線程訪問時,該條目的實用程序就會消失。緩存

IdentityHashMap是基於哈希表的基於身份的Map實現,此類對於保留拓撲的對象圖轉換(例如序列化或深度複製)頗有用,要執行此類轉換,您須要維護一個基於身份的「節點表」,以跟蹤已看到哪些對象,基於身份的映射還用於在動態調試器和相似系統中維護對象到元信息的映射。最後,基於身份的映射在阻止「欺騙攻擊」方面頗有用,由於「僞欺騙」攻擊是故意有害的equals方法的結果,由於IdentityHashMap從未在其鍵上調用equals方法,此實現的另外一個好處是它速度很快。安全

併發Map實現

java.util.concurrent包包含ConcurrentMap接口,該接口使用原子putIfAbsentremovereplace方法以及該接口的ConcurrentHashMap實現擴展了Map數據結構

ConcurrentHashMap是由哈希表支持的高併發的高性能實現,此實如今執行檢索時不會阻塞,並容許客戶端選擇併發級別進行更新。它旨在替代Hashtable:除了實現ConcurrentMap外,它還支持Hashtable特有的全部遺留方法。一樣,若是你不須要遺留操做,請當心使用ConcurrentMap接口對其進行操做。併發


上一篇:List實現

相關文章
相關標籤/搜索