文档

Java™ 教程
隐藏目录
Map 实现
路径:集合
课程:实现

映射实现

Map实现分为通用型、特殊型和并发型实现。

通用型Map实现

通用型的Map实现有HashMapTreeMapLinkedHashMap。如果你需要SortedMap操作或按键排序的Collection遍历,使用TreeMap;如果你想要最大速度且不关心遍历顺序,使用HashMap;如果你想要接近HashMap性能且按插入顺序遍历,使用LinkedHashMap。在这方面,Map的情况类似于Set。同样,Set实现部分中的其他内容也适用于Map实现。

LinkedHashMap提供了两个LinkedHashSet不具备的功能。当你创建一个LinkedHashMap时,你可以基于键的访问顺序来排序它,而不是插入顺序。换句话说,仅仅查找与键关联的值会将该键移动到映射的末尾。此外,LinkedHashMap提供了removeEldestEntry方法,可以重写该方法以在向映射添加新的映射时自动删除过时的映射。这使得实现自定义缓存非常容易。

例如,下面的重写将允许该映射增长到最多100个条目,然后每次添加新条目时,它将删除最老的条目,以维持100个条目的稳态。

private static final int MAX_ENTRIES = 100;

protected boolean removeEldestEntry(Map.Entry eldest) {
    return size() > MAX_ENTRIES;
}

特殊型Map实现

特殊型的Map实现有EnumMapWeakHashMapIdentityHashMap。以array内部实现的EnumMap是一种高性能的用于枚举键的Map实现。该实现结合了Map接口的丰富性和安全性,速度接近数组。如果你想将枚举映射到一个值,应优先使用EnumMap而不是数组。

WeakHashMap是实现了Map接口的类,它只存储对其键的弱引用。仅存储弱引用使得当键不再在WeakHashMap外部引用时,可以对键值对进行垃圾回收。这个类提供了利用弱引用的最简单方式。它对于实现"注册表"类似的数据结构非常有用,在这种数据结构中,当键不再被任何线程引用时,条目的实用性消失。

IdentityHashMap是一个基于标识的Map实现,它基于哈希表。这个类对于保持拓扑结构的对象图转换非常有用,比如序列化或深拷贝。为了执行这样的转换,你需要维护一个基于标识的"节点表",用于跟踪已经被访问过的对象。基于标识的映射也用于在动态调试器和类似系统中维护对象到元信息的映射。最后,基于标识的映射在阻止由于故意反常的equals方法而导致的"欺骗攻击"方面也非常有用,因为IdentityHashMap不会调用其键的equals方法。这个实现的一个附加好处是它很快。

并发映射实现

java.util.concurrent包包含了扩展了Map的原子putIfAbsentremovereplace方法的ConcurrentMap接口,以及该接口的实现ConcurrentHashMap

ConcurrentHashMap是一个高度并发、高性能的基于哈希表的实现。这个实现在执行检索操作时不会阻塞,并允许客户端选择并发级别进行更新。它被设计成Hashtable的一个即插即用替代品:除了实现ConcurrentMap接口,它还支持所有与Hashtable特有的遗留方法。同样,如果你不需要遗留操作,要小心使用ConcurrentMap接口操作它。


上一页:列表实现
下一页:队列实现