Map實現分爲通用、專用和併發實現。html
三種通用Map實現是HashMap、TreeMap和LinkedHashMap。若是須要SortedMap
操做或鍵順序的集合視圖迭代,請使用TreeMap
;若是你想要最大速度而且不關心迭代順序,請使用HashMap
;若是要得到近乎HashMap
的性能和插入順序迭代,請使用LinkedHashMap
。在這方面,Map
的狀況相似於Set
。java
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
實現 — EnumMap、WeakHashMap和IdentityHashMap。EnumMap
在內部實現爲數組,是一種用於枚舉鍵的高性能Map
實現,此實現將Map
接口的豐富性和安全性與接近數組的速度結合在一塊兒,若是要將枚舉映射到值,則應始終使用EnumMap
優先於數組。數組
WeakHashMap
是Map
接口的實現,它只存儲對其鍵的弱引用,僅存儲弱引用時,若是再也不在WeakHashMap
以外引用其鍵,則能夠對鍵值對進行垃圾回收。此類提供了利用弱引用功能的最簡單方法,這對於實現「相似註冊表」的數據結構頗有用,在該結構中,當某個條目的鍵再也不被任何線程訪問時,該條目的實用程序就會消失。緩存
IdentityHashMap
是基於哈希表的基於身份的Map
實現,此類對於保留拓撲的對象圖轉換(例如序列化或深度複製)頗有用,要執行此類轉換,您須要維護一個基於身份的「節點表」,以跟蹤已看到哪些對象,基於身份的映射還用於在動態調試器和相似系統中維護對象到元信息的映射。最後,基於身份的映射在阻止「欺騙攻擊」方面頗有用,由於「僞欺騙」攻擊是故意有害的equals
方法的結果,由於IdentityHashMap
從未在其鍵上調用equals
方法,此實現的另外一個好處是它速度很快。安全
java.util.concurrent包包含ConcurrentMap接口,該接口使用原子putIfAbsent
、remove
和replace
方法以及該接口的ConcurrentHashMap實現擴展了Map
。數據結構
ConcurrentHashMap
是由哈希表支持的高併發的高性能實現,此實如今執行檢索時不會阻塞,並容許客戶端選擇併發級別進行更新。它旨在替代Hashtable
:除了實現ConcurrentMap
外,它還支持Hashtable
特有的全部遺留方法。一樣,若是你不須要遺留操做,請當心使用ConcurrentMap
接口對其進行操做。併發