本文共 1426 字,大约阅读时间需要 4 分钟。
Map实现分为通用目的、特殊目的和并发实现。
这三个通用的Map实现是HashMap、TreeMap和LinkedHashMap。如果您需要SortedMap操作或键排序的集合视图迭代,请使用TreeMap;如果您想要最大速度,而不关心迭代顺序,请使用HashMap;如果您想要接近hashmap的性能和插入顺序迭代,请使用LinkedHashMap。在这方面,Map的情况类似于Set。同样,Set实现部分中的其他内容也适用于Map实现。
LinkedHashMap提供了两个无法在LinkedHashSet中使用的功能。当您创建LinkedHashMap时,您可以基于键访问而不是插入来排序。换句话说,仅仅查找与一个键相关的值就可以将该键带到映射的末尾。此外,LinkedHashMap提供了removeEldestEntry方法,它可能被重写,以便在将新映射添加到映射时自动删除陈旧的映射。这使得实现自定义缓存变得非常容易。
例如,这个重写将允许map增长到多达100个条目,并且每次添加新条目时它将删除最大的条目,保持100个条目的稳定状态。
private static final int MAX_ENTRIES = 100;protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_ENTRIES;}
有三个特殊用途的映射实现——EnumMap、WeakHashMap和IdentityHashMap。在内部实现为数组的EnumMap是一个用于使用enum键的高性能映射实现。这个实现将Map接口的丰富和安全性与一个数组的速度相结合。如果您想要将一个枚举映射到一个值,您应该始终使用一个枚举列表来选择一个数组。
WeakHashMap是映射接口的一个实现,它只存储对其键的弱引用。只存储弱引用允许键值对在它的键不再在WeakHashMap之外被引用时被垃圾收集。这个类提供了利用弱引用的能力的最简单方法。它对于实现“类似于注册的”数据结构非常有用,当一个条目的键不再被任何线程访问时,它就会消失。
IdentityHashMap是基于散列表的基于身份的映射实现。这个类对于保存对象图转换(如序列化或深度复制)非常有用。要执行这样的转换,您需要维护一个基于标识的“节点表”,该“节点表”可以跟踪哪些对象已经被看到。基于身份的映射还用于在动态调试器和类似的系统中维护对象到元信息的映射。最后,基于身份的映射在挫败“欺骗攻击”方面是有用的,因为标识hashmap从不调用它的键上的equals方法。这个实现的另一个好处是它是快速的。
java.util.concurrent包包含ConcurrentMap接口,该接口扩展了与原子putIfAbsent、remove和replace方法的映射,以及该接口的ConcurrentHashMap实现。
ConcurrentHashMap是一个高度并发的高性能实现,由散列表支持。在执行检索时,该实现从不阻塞,并且允许客户端选择并发级别进行更新。它的目的是作为Hashtable的替代:除了实现ConcurrentMap之外,它还支持Hashtable特有的所有遗留方法。同样,如果您不需要遗留操作,请小心使用ConcurrentMap接口操作它。
转载地址:http://beqab.baihongyu.com/