- java.lang.Object
-
- java.util.AbstractMap<K,V>
-
- java.util.HashMap<K,V>
-
- java.util.LinkedHashMap<K,V>
-
- 参数类型
-
K
- 由此地图维护的键的类型 -
V
- 映射值的类型
- All Implemented Interfaces:
-
Serializable
,Cloneable
,Map<K,V>
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
哈希表和链表实现的
Map
接口,具有可预测的迭代顺序。 该实现与HashMap
不同之处在于它保持双向链接列表的所有条目。 此链接列表定义迭代排序,通常是将键插入到地图( 插入顺序 )中的顺序 。 请注意,如果将键重新插入到地图中,则插入顺序不受影响。 (A键k
被重新插入到地图m
如果m.put(k, v)
时被调用m.containsKey(k)
将返回true
之前立即调用。)此实施方式使其客户不受
TreeMap
(和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
的收集视图进行LinkedHashMap
需要与地图大小成比例的时间,无论其容量如何。HashMap
迭代可能更昂贵,需要与其容量成比例的时间。链接的哈希映射有两个参数影响其性能: 初始容量和负载因子 。 它们的定义精确到
HashMap
。 但是,请注意,对于这个类别HashMap
,选择过高的初始容量的价值不如HashMap
那么严格,因为这个类的迭代次数不受容量的影响。请注意,此实现不同步。 如果多个线程同时访问链接的散列映射,并且至少一个线程在结构上修改映射,则必须在外部进行同步。 这通常通过在自然地封装地图的一些对象上同步来实现。 如果没有这样的对象存在,应该使用
Collections.synchronizedMap
方法“包装”地图。 这最好在创建时完成,以防止意外的不同步访问地图:Map m = Collections.synchronizedMap(new LinkedHashMap(...));
结构修改是添加或删除一个或多个映射的任何操作,或者在访问有序链接的散列图的情况下,影响迭代顺序。 在插入有序的链接散列图中,仅改变与已经包含在地图中的键相关联的值不是结构修改。 在访问有序的链接散列图中,仅使用get
查询地图是一种结构修改。 )由所有这个类的集合视图方法返回的集合的
iterator
方法返回的迭代器是fail-fast :如果映射在迭代器创建之后的任何时间被结构地修改,除了通过迭代器自己的remove
方法之外,迭代器将抛出一个ConcurrentModificationException
。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速的迭代器
ConcurrentModificationException
扔出ConcurrentModificationException
。 因此,编写依赖于此异常的程序的正确性将是错误的: 迭代器的故障快速行为应仅用于检测错误。由这个类的所有集合视图方法返回的集合的spliterator方法返回的分配器是late-binding , fail-fast ,另外报告
Spliterator.ORDERED
。这个班是Java Collections Framework的会员。
- Implementation Note:
- 由所有这个类的集合视图方法返回的集合的spliterator方法返回的spliterator是从相应集合的迭代器创建的。
- 从以下版本开始:
- 1.4
- 另请参见:
-
Object.hashCode()
,Collection
,Map
,HashMap
,TreeMap
,Hashtable
, Serialized Form
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class java.util.AbstractMap
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
-
-
构造方法摘要
构造方法 Constructor 描述 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 方法 描述 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
视图。-
Methods inherited from class java.util.AbstractMap
equals, hashCode, toString
-
Methods inherited from class java.util.HashMap
clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, size
-
-
-
-
构造方法详细信息
-
LinkedHashMap
public LinkedHashMap(int initialCapacity, float loadFactor)
构造具有指定的初始容量和负载因子的空插入LinkedHashMap
实例。- 参数
-
initialCapacity
- 初始容量 -
loadFactor
- 负载系数 - 异常
-
IllegalArgumentException
- 如果初始容量为负值或负载系数为正数
-
LinkedHashMap
public LinkedHashMap(int initialCapacity)
构造具有指定初始容量和默认负载因子(0.75)的空插入订单LinkedHashMap
实例。- 参数
-
initialCapacity
- 初始容量 - 异常
-
IllegalArgumentException
- 如果初始容量为负
-
LinkedHashMap
public LinkedHashMap()
构造具有默认初始容量(16)和负载因子(0.75)的空插入订单LinkedHashMap
实例。
-
LinkedHashMap
public LinkedHashMap(Map<? extends K,? extends V> m)
构造具有与指定地图相同映射的插入式LinkedHashMap
实例。 创建LinkedHashMap
实例的默认负载因子(0.75),初始容量足以容纳指定映射中的映射。- 参数
-
m
- 其映射将放置在此映射中的映射 - 异常
-
NullPointerException
- 如果指定的地图为空
-
LinkedHashMap
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
构造一个空的LinkedHashMap
实例,具有指定的初始容量,负载因子和订购模式。- 参数
-
initialCapacity
- 初始容量 -
loadFactor
- 负载系数 -
accessOrder
- 订购模式 -true
用于访问顺序,false
用于插入顺序 - 异常
-
IllegalArgumentException
- 如果初始容量为负值或负载系数为非正值
-
-
方法详细信息
-
containsValue
public boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定的值,则返回true
。- Specified by:
-
containsValue
在接口Map<K,V>
- 重写:
-
containsValue
在HashMap<K,V>
- 参数
-
value
- 要在该地图中存在的值要测试的值 - 结果
-
true
如果该地图将一个或多个键映射到指定的值
-
get
public V get(Object key)
返回指定键映射到的值,如果此映射不包含键的映射,则返回null
。更正式地,如果此映射包含从密钥映射
k
到值v
使得(key==null ? k==null : key.equals(k))
,则此方法返回v
; 否则返回null
。 (最多可以有一个这样的映射。)返回值为
null
并不一定表示该映射不包含该键的映射; 地图也可能明确地将密钥映射到null
。 可以使用containsKey
操作来区分这两种情况。
-
getOrDefault
public V getOrDefault(Object key, V defaultValue)
返回指定键映射到的值,如果此映射不包含该键的映射,则返回defaultValue
。- Specified by:
-
getOrDefault
在接口Map<K,V>
- 重写:
-
getOrDefault
在HashMap<K,V>
- 参数
-
key
- 要返回其关联值的键 -
defaultValue
- 键的默认映射 - 结果
-
映射指定键的值,如果此映射不包含键的映射,
defaultValue
-
clear
public void clear()
从这张地图中删除所有的映射。 此呼叫返回后,地图将为空。
-
removeEldestEntry
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
如果此地图应删除其最老的条目,则返回true
。 在将新条目插入到地图中后,此方法由put
和putAll
调用。 它为实施者提供每次添加新的条目时删除最老条目的机会。 如果地图表示缓存,则此功能非常有用:它可以通过删除失效条目来减少内存消耗。示例使用:此覆盖将允许地图长达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
调用之前地图为空,则将是刚插入的条目; 换句话说,如果地图包含单个条目,则最长条目也是最新的条目。 - 结果
-
true
如果最长的条目应该从地图中删除;false
如果应该保留。
-
keySet
public Set<K> keySet()
返回此地图中包含的键的Set
视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove
操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove
,Set.remove
,removeAll
,retainAll
,和clear
操作。 它不支持add
或addAll
操作。 其Spliterator
通常提供更快的顺序性能,但是比HashMap
更差的并行性能。
-
values
public Collection<V> values()
返回此地图中包含的值的Collection
视图。 集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove
操作),迭代的结果是未定义的。 该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove
,Collection.remove
,removeAll
,retainAll
和clear
操作。 它不支持add
或addAll
操作。 其Spliterator
通常提供更快的顺序性能,但是比HashMap
更差的并行性能。
-
entrySet
public Set<Map.Entry<K,V>> entrySet()
返回此地图中包含的映射的Set
视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果映射被修改,而该集合中的迭代正在进行(除了通过迭代器自己的remove
操作,或者通过迭代器返回的映射条目上的setValue
操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove
,Set.remove
,removeAll
,retainAll
和clear
操作。 它不支持add
或addAll
操作。 其Spliterator
通常提供更快的顺序性能,但是比HashMap
更差的并行性能。
-
forEach
public void forEach(BiConsumer<? super K,? super V> action)
说明从接口Map
复制对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。 除非实现类另有指定,否则按照进入设置迭代的顺序执行操作(如果指定了迭代顺序)。操作引发的异常被转发给调用者。
-
replaceAll
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
描述从接口Map
复制将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。 函数抛出的异常被转发给调用方。- Specified by:
-
replaceAll
在接口Map<K,V>
- 重写:
-
replaceAll
在HashMap<K,V>
- 参数
-
function
- 应用于每个条目的功能
-
-