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实现

相关文章
相关标签/搜索