Map实现
Map实现分为通用、专用和并发实现。
通用Map实现
三种通用Map实现是HashMap、TreeMap和LinkedHashMap。如果需要SortedMap
操作或键顺序的集合视图迭代,请使用TreeMap
;如果你想要最大速度并且不关心迭代顺序,请使用HashMap
;如果要获得近乎HashMap
的性能和插入顺序迭代,请使用LinkedHashMap
。在这方面,Map
的情况类似于Set
。
LinkedHashMap
提供了LinkedHashSet
不具备的两种功能,创建LinkedHashMap
时,可以基于键访问而不是插入对其进行排序,换句话说,仅查找与键关联的值会将键带到Map
的末尾。另外,LinkedHashMap
提供了removeEldestEntry
方法,当将新映射添加到Map
时,可以重写该方法以强加一个策略来自动删除陈旧的映射,这使得实现自定义缓存非常容易。
例如,此重写将使Map
最多可以扩展到100个条目,然后每次添加新条目时都会删除最旧的条目,从而保持100个条目的稳定状态。
private static final int MAX\_ENTRIES = 100;
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
专用Map实现
有三种特殊的Map
实现 — EnumMap、WeakHashMap和IdentityHashMap。EnumMap
在内部实现为数组,是一种用于枚举键的高性能Map
实现,此实现将Map
接口的丰富性和安全性与接近数组的速度结合在一起,如果要将枚举映射到值,则应始终使用EnumMap
优先于数组。
WeakHashMap
是Map
接口的实现,它只存储对其键的弱引用,仅存储弱引用时,如果不再在WeakHashMap
之外引用其键,则可以对键值对进行垃圾回收。此类提供了利用弱引用功能的最简单方法,这对于实现“类似注册表”的数据结构很有用,在该结构中,当某个条目的键不再被任何线程访问时,该条目的实用程序就会消失。
IdentityHashMap
是基于哈希表的基于身份的Map
实现,此类对于保留拓扑的对象图转换(例如序列化或深度复制)很有用,要执行此类转换,您需要维护一个基于身份的“节点表”,以跟踪已看到哪些对象,基于身份的映射还用于在动态调试器和类似系统中维护对象到元信息的映射。最后,基于身份的映射在阻止“欺骗攻击”方面很有用,因为“伪欺骗”攻击是故意有害的equals
方法的结果,因为IdentityHashMap
从未在其键上调用equals
方法,此实现的另一个好处是它速度很快。
并发Map实现
java.util.concurrent包包含ConcurrentMap接口,该接口使用原子putIfAbsent
、remove
和replace
方法以及该接口的ConcurrentHashMap实现扩展了Map
。
ConcurrentHashMap
是由哈希表支持的高并发的高性能实现,此实现在执行检索时不会阻塞,并允许客户端选择并发级别进行更新。它旨在替代Hashtable
:除了实现ConcurrentMap
外,它还支持Hashtable
特有的所有遗留方法。同样,如果你不需要遗留操作,请小心使用ConcurrentMap
接口对其进行操作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。