- java.lang.Object
-
- java.util.AbstractMap<K,V>
-
- java.util.HashMap<K,V>
-
- java.util.LinkedHashMap<K,V>
-
- 参数类型
-
K
- 此映射维护的密钥类型 -
V
- 映射值的类型
- 实现的所有接口
-
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
之前立即调用。)此实现使其客户免于
HashMap
(和Hashtable
)提供的未指定的,通常混乱的排序,而不会产生与TreeMap
相关的增加的成本。 无论原始地图的实现如何,它都可用于生成与原始地图具有相同顺序的地图副本:void foo(Map m) { Map copy = new LinkedHashMap(m); ... }
如果模块在输入上获取地图,复制它,然后返回其顺序由副本确定的结果,则此技术特别有用。 (客户通常会欣赏按照提交的顺序返回的内容。)提供了一个特殊的
构造器
来创建链接的哈希映射,其迭代顺序是其条目最后一次访问的顺序,从最近访问到最近( 访问顺序 )。 这种地图非常适合构建LRU缓存。 调用put
,putIfAbsent
,get
,getOrDefault
,compute
,computeIfAbsent
,computeIfPresent
,或merge
中的相应条目的接入方法的结果(假设调用完成后它存在)。 如果替换值,则replace
方法仅导致访问条目。putAll
方法为指定映射中的每个映射生成一个条目访问,按照指定映射的条目集迭代器提供键 - 值映射的顺序。 没有其他方法可以生成条目访问。 特别是,对集合视图的操作不会影响后备映射的迭代顺序。可以重写
removeEldestEntry(Map.Entry)
方法,以便在将新映射添加到地图时自动删除过时映射的策略。此类提供所有可选的
Map
操作,并允许null元素。 像HashMap
,它提供了基本操作(稳定的性能add
,contains
和remove
),假设散列函数散桶中适当的元件。 由于维护链表的额外费用,性能可能略低于HashMap
性能,但有一个例外:对LinkedHashMap
的集合视图的LinkedHashMap
需要与地图大小成比例的时间,无论其容量如何。 对HashMap
迭代可能更昂贵,需要与其容量成比例的时间。链接的哈希映射有两个影响其性能的参数: 初始容量和负载因子 。 它们的定义与
HashMap
。 但请注意,对于此类,选择过高的初始容量值的惩罚要小于HashMap
,因为此类的迭代次数不受容量影响。请注意,此实现不同步。 如果多个线程同时访问链接的哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。 这通常通过在自然封装地图的某个对象上进行同步来实现。 如果不存在此类对象,则应使用
Collections.synchronizedMap
方法“包装”地图。 这最好在创建时完成,以防止意外地不同步访问地图:Map m = Collections.synchronizedMap(new LinkedHashMap(...));
结构修改是添加或删除一个或多个映射的任何操作,或者在访问顺序链接的哈希映射的情况下,影响迭代顺序。 在插入有序链接散列映射中,仅更改与已包含在映射中的键相关联的值不是结构修改。 在访问有序链接哈希映射中,仅使用get
查询映射是结构修改。 )由此类的所有集合视图方法返回的集合的
iterator
方法返回的迭代器是快速失败的 :如果在创建迭代器之后的任何时候对映射进行结构修改,除了通过迭代器自己的remove
方法之外,迭代器将抛出ConcurrentModificationException
。 因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险。请注意,迭代器的快速失败行为无法得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证。 失败快速迭代器以尽力而为的方式抛出
ConcurrentModificationException
。 因此,编写依赖于此异常的程序以确保其正确性是错误的: 迭代器的快速失败行为应该仅用于检测错误。由此类的所有集合视图方法返回的集合的spliterator方法返回的分裂器是late-binding , 故障快速 ,另外报告
Spliterator.ORDERED
。此类是Java Collections Framework的成员。
- Implementation Note:
- 由所有类的集合视图方法返回的集合的spliterator方法返回的分裂器是从相应集合的迭代器创建的。
- 从以下版本开始:
- 1.4
- 另请参见:
-
Object.hashCode()
,Collection
,Map
,HashMap
,TreeMap
,Hashtable
, Serialized Form
-
-
嵌套类汇总
-
嵌套类/接口声明在类 java.util.AbstractMap
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
-
-
构造方法摘要
构造方法 构造器 描述 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
实例,其实例与指定的映射相同。
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 boolean
containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回true
。Set<Map.Entry<K,V>>
entrySet()
返回此映射中包含的映射的Set
视图。V
get(Object key)
返回指定键映射到的值,如果此映射不包含键的映射,则返回null
。Set<K>
keySet()
返回此映射中包含的键的Set
视图。protected boolean
removeEldestEntry(Map.Entry<K,V> eldest)
如果此地图应删除其最true
则返回true
。Collection<V>
values()
返回此映射中包含的值的Collection
视图。-
声明方法的类 java.util.HashMap
clear, clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, put, putAll, remove, size
-
声明方法的类 java.util.AbstractMap
equals, hashCode, toString
-
声明方法的接口 java.util.Map
clear, compute, computeIfAbsent, computeIfPresent, containsKey, equals, forEach, getOrDefault, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, replaceAll, 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
- 如果指定的映射为null
-
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
操作来区分这两种情况。
-
removeEldestEntry
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
如果此地图应删除其最true
则返回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
(因此此映射的行为类似于普通映射 - 永远不会删除最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
并行性能差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
差HashMap
。
-
-