java-collection-LinkedHashMap

Map接口的哈希表和链表实现

结构

java-collection-LinkedHashMap_第1张图片

特点
可预测的迭代顺序。它维护一个双链表。
所有的条目。这个链表定义了迭代排序,
通常是键插入到Map中的顺序。
注意插入顺序不受影响。

链表 定义了迭代顺序,按照插入的顺序,
插入顺序不受影响 如果一个key重新插入到map当中

一个key重新插入到map中 如果m.put(k,v)被调用 m.containsKey(k) 会返回true 立即优先调用这个方法

这个实现节省了客户端从未指定的 总体的混乱的顺序由hashmap和hashtable 不会引起和TreeMap相关的增长的成本

此类提供所有可选的映射操作,以及允许空元素
HashMap ,它提供恒定的时间基本操作的性能(add\contains\remove),
假设散列函数分散元素正确地在桶之间。
性能可能只是轻微低于HashMap,由于增加了链接列表维护费用。
有一个例外:集合视图上的迭代LinkedHashMap需要的时间与map的大小成比例。
不管Map的容量如何,关于HashMap的迭代可能更昂贵,需要时间与它的容量成比例。

LRU
它可以用来产生一个具有相同顺序的Map的副本。
不管原始Map的实现:

void foo(Map m) {
         Map copy = new LinkedHashMap(m);
         ...
}

这个技术特别有用如果一个模块使用一个map作为input 拷贝它 然后返回结果 顺序由拷贝副本决定 客户端一般喜欢拥有现在同样顺序的返回值
{@link #LinkedHashMap(int,float,boolean) constructor}创造一个linked Hash map 迭代顺序
*提供创建链接哈希映射,其迭代顺序为顺序,其条目是最后访问的,
从最近最少访问到最近最多(访问顺序)。这种Map非常适合构建LRU 缓存
通过调用put putIfAbsent get getOrDefault compute computeIfAbsent
computeIfPresent merge
访问响应entry 假设它存在再调用完成之后

replace
replace 方法仅仅产生访问entry 结果 在如果这个值被替换之后

putAll
putAll方法 产生一个entry access 为每个map在特定的map中
key value map 被提供特定map的entry set 迭代
没有其他方法生成入口访问,特别是操作在集合视图中,影响迭代的顺序

removeEldestEntry
removeEldestEntry(Map.Entry)方法可以重写为当新映射时,强制删除过时映射的策略,
当一个新的map加入到map当中

有两个参数影响其性能
初始容量和负载因子。它们是精确定义的。
相对于HashMap。但是,要注意选择一个初始容量过高的值对于这个类影响来说不是那么严重。
对于HashMap,因为该类的迭代时间不受容量影响。

同步
注意此实现不同步,如果多个线程同时访问链接散列映射,则至少其中一个线程在结构上修改映射,它必须进行外部同步。
这通常是通过对一些自然封装Map的对象进行同步。
*如果不存在这样的对象,则应该使用“包装”来映射该映射。
{@link Collections#synchronizedMap Collections.synchronizedMap}
*方法。最好在创建时完成,以防止map的非同步访问意外发生。
Map m = Collections.synchronizedMap(new LinkedHashMap(…))

*结构修改是添加或删除一个或多个操作的任何操作。映射,或者在访问有序链接哈希映射的情况下,影响
迭代顺序。在插入有序链接哈希映射中,仅仅改变与已经包含在地图中的键相关联的值不是
*结构修改。在访问有序链接哈希映射中的仅用get查询地图是一种结构修改。
集合的iterator方法返回的迭代器fail-fast
如果map在任何时候被修改迭代器 以任何方式创建 除了通过迭代器自身debug方法 迭代器将抛出 ConcurrentModificationException
面对并发修改 迭代器快速而干净失败 而不是冒险在未来不确定的时间内任意的、不确定的行为

spliterators
spliterators方法 返回的late-bingding、fail-fast\additional report

你可能感兴趣的:(jdk)