1

Map实现

Map实现分为通用、专用和并发实现。

通用Map实现

三种通用Map实现是HashMapTreeMapLinkedHashMap。如果需要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实现 — 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实现

博弈
2.5k 声望1.5k 粉丝

态度决定一切