K
- 由该地图维护的键的类型
V
- 映射值的类型
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
哈希表和链表实现的Map接口,具有可预测的迭代次序。 这种实现不同于HashMap,它维持于所有条目的运行双向链表。 此链接列表定义迭代排序,通常是将键插入到地图(插入顺序 )中的顺序 。 请注意,如果将键重新插入到地图中,则插入顺序不受影响。 (A键k被重新插入到地图m如果当m.containsKey(k)将返回true之前立即调用m.put(k, v)被调用。)
此实现可以让客户从提供的指定,通常杂乱无章的排序HashMap
(及Hashtable
),而不会导致与其相关的成本增加TreeMap
。 无论原始地图的实现如何,它都可用于生成与原始地图相同顺序的地图副本:
void foo(Map m) {
Map copy = new LinkedHashMap(m);
...
}
如果模块在输入上进行映射,复制它,然后返回其顺序由该副本决定的结果,则此技术特别有用。
(客户一般都喜欢以相同的顺序返回事情。)
提供了一种特殊的constructor
来创建一个链接的哈希映射,其迭代顺序是最后访问的条目的顺序,从最近最近访问到最近的( 访问顺序 )。 这种地图非常适合建立LRU缓存。 调用put
, putIfAbsent
, get
, getOrDefault
, compute
, computeIfAbsent
, computeIfPresent
,或merge
中的相应条目的接入方法的结果(假设调用完成后它存在)。 replace
方法只会导致条目的访问,如果该值被替换。 putAll
方法按照指定地图的条目集迭代器提供的键值映射的顺序,为指定地图中的每个映射生成一个条目访问。 没有其他方法生成条目访问。 特别地,对于集合视图的操作不会影响背景映射的迭代顺序。
removeEldestEntry(Map.Entry)
方法可能会被覆盖,以便在将新的映射添加到地图时,自动执行删除过时映射的策略。
此类提供了所有可选的Map操作,并允许空元素。 像HashMap,它提供了基本操作(add,contains和remove)稳定的性能,假定散列函数散桶中适当的元件。 表现可能略低于HashMap的水平 ,这是由于维护链表的额外费用,除了一个例外:LinkedHashMap的收集视图的迭代需要与地图大小成比例的时间,无论其容量如何。 HashMap的迭代可能更昂贵,需要与其容量成比例的时间。
链接的哈希映射有两个参数影响其性能: 初始容量和负载因子 。 它们的定义正如HashMap 。 但是请注意,该惩罚为初始容量选择非常高的值是该类比HashMap不太严重的,因为迭代次数对于这个类是由容量不受影响。
请注意,此实现不同步。 如果多个线程同时访问链接的散列映射,并且至少一个线程在结构上修改映射,则必须在外部进行同步。 这通常通过在自然地封装地图的一些对象上同步来实现。 如果没有这样的对象存在,应该使用Collections.synchronizedMap
方法“包装”地图。 这最好在创建时完成,以防止意外的不同步访问地图:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
结构修改是添加或删除一个或多个映射的任何操作,或者在访问有序链接的散列图的情况下,影响迭代顺序。
在插入有序的链接散列图中,仅改变与已经包含在地图中的键相关联的值不是结构修改。
在访问有序的链接散列图中,仅使用get查询地图是一种结构修改。
)
通过所有这些类的集合视图方法返回的藏品iterator方法返回的迭代器是快速失败的 :如果地图是在任何时间从结构上修改创建迭代器之后,以任何方式,除了通过迭代器自己remove方法,迭代器会抛出一个ConcurrentModificationException
。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。
请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器尽力投入ConcurrentModificationException 。 因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。
由所有这个类的集合视图方法返回的集合的spliterator方法返回的分配器是late-binding , fail-fast ,另外报告Spliterator.ORDERED
。
Object.hashCode()
, Collection
, Map
, HashMap
, TreeMap
, Hashtable
, Serialized Form
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
Constructor and Description |
---|
LinkedHashMap()
构造具有默认初始容量(16)和负载因子(0.75)的空插入订购
LinkedHashMap实例。
|
LinkedHashMap(int initialCapacity)
构造具有指定初始容量和默认负载因子(0.75)的空插入订购
LinkedHashMap实例。
|
LinkedHashMap(int initialCapacity, float loadFactor)
构造具有指定初始容量和负载因子的空插入订购
LinkedHashMap实例。
|
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
构造一个空的
LinkedHashMap实例,具有指定的初始容量,负载因子和订购模式。
|
LinkedHashMap(Map<? extends K,? extends V> m)
构造具有与指定地图相同映射的插入序列
LinkedHashMap实例。
|
Modifier and Type | Method and Description |
---|---|
void |
clear()
从这张地图中删除所有的映射。
|
boolean |
containsValue(Object value)
如果该地图将一个或多个键映射到指定的值,则返回
true 。
|
Set<Map.Entry<K,V>> |
entrySet()
返回此地图中包含的映射的 Set 视图。
|
void |
forEach(BiConsumer<? super K,? super V> action)
对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。
|
V |
get(Object key)
返回到指定键所映射的值,或
null 如果此映射包含该键的映射。
|
V |
getOrDefault(Object key, V defaultValue)
返回到指定键所映射的值,或
defaultValue 如果此映射包含该键的映射。
|
Set<K> |
keySet()
返回此地图中包含的键的 Set 视图。
|
protected boolean |
removeEldestEntry(Map.Entry<K,V> eldest)
如果此地图应删除其最老的条目,则返回
true 。
|
void |
replaceAll(BiFunction<? super K,? super V,? extends V> function)
将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。
|
Collection<V> |
values()
返回此地图中包含的值的 Collection 视图。
|
clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, size
equals, hashCode, toString
finalize, getClass, notify, notifyAll, wait, wait, wait
compute, computeIfAbsent, computeIfPresent, containsKey, equals, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, size
public LinkedHashMap(int initialCapacity, float loadFactor)
initialCapacity
- 初始容量
loadFactor
- 负载因子
IllegalArgumentException
- 如果初始容量为负值或负载系数为正
public LinkedHashMap(int initialCapacity)
initialCapacity
- 初始容量
IllegalArgumentException
- 如果初始容量为负
public LinkedHashMap()
public LinkedHashMap(Map<? extends K,? extends V> m)
m
- 其映射将放置在该地图中的地图
NullPointerException
- 如果指定的地图为空
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
initialCapacity
- 初始容量
loadFactor
- 负载因子
accessOrder
- 订购模式 -
true的访问顺序,
false的插入顺序
IllegalArgumentException
- 如果初始容量为负值或负载系数为非正值
public boolean containsValue(Object value)
containsValue
在界面
Map<K,V>
containsValue
在
HashMap<K,V>
value
- 要在此地图中存在的值要进行测试
public V get(Object key)
null
如果此映射包含该键的映射。
更正式地,如果这张地图包含一个从一个键k
到一个值v
,这样(key==null ? k==null : key.equals(k))
,那么这个方法返回v
; 否则返回null
。 (最多可以有一个这样的映射。)
返回值为null
并不一定表示该映射不包含该键的映射; 地图也可能将密钥明确地映射到null
。 可以使用containsKey
操作来区分这两种情况。
public V getOrDefault(Object key, V defaultValue)
defaultValue
如果此映射包含该键的映射。
getOrDefault
在界面
Map<K,V>
getOrDefault
在
HashMap<K,V>
key
- 要返回其关联值的键
defaultValue
- 键的默认映射
defaultValue
public void clear()
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
示例使用:此覆盖将允许地图长达100个条目,然后每次添加新条目时删除最老条目,保持100个条目的稳定状态。
private static final int MAX_ENTRIES = 100;
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
该方法通常不会以任何方式修改地图,而是允许地图按其返回值的指示进行修改。 它被允许用于此方法来直接修改地图,但如果这样做的话,它必须返回false(指示地图不应试图任何进一步的修改)。 从该方法中修改地图之后返回true的效果是未指定的。
这个实现只返回false (这样,这个地图就像一个法线贴图 - 最老的元素永远不会被删除)。
eldest
- 地图中最近插入的条目,或者如果这是访问顺序的地图,最近访问的条目。
这是将被删除的条目,此方法返回true 。
如果在put或putAll调用之前地图为空,导致此调用,则将是刚插入的条目;
换句话说,如果地图包含单个条目,则最长条目也是最新的条目。
public Set<K> keySet()
Set
视图。
该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果映射被修改,而该集合中的迭代正在进行(除了通过迭代器自己的remove操作),迭代的结果是未定义的。
该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
其Spliterator
通常提供更快的顺序性能,但是比HashMap更差的并行HashMap
。
public Collection<V> values()
Collection
视图。
集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。
该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove,Collection.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
它的Spliterator
通常提供更快的顺序性能,但是比HashMap更差的并行HashMap
。
public Set<Map.Entry<K,V>> entrySet()
Set
视图。
该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行时(除了通过迭代器自己的remove操作,或者通过迭代器返回的映射条目上的setValue操作)修改映射,则迭代的结果是未定义的。
该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
它的Spliterator
通常提供更快的顺序性能,但是比HashMap更差的并行HashMap
。
public void forEach(BiConsumer<? super K,? super V> action)
Map
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
Map
replaceAll
在界面
Map<K,V>
replaceAll
在
HashMap<K,V>
function
- 应用于每个条目的功能