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
接口对其进行操做。并发