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, sizeequals, hashCode, toStringfinalize, getClass, notify, notifyAll, wait, wait, waitcompute, computeIfAbsent, computeIfPresent, containsKey, equals, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, sizepublic 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 - 应用于每个条目的功能
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.