当前位置首页 > 百科> 正文

LinkedHashMap

2019-10-04 17:31:35 百科

LinkedHashMap

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

Map 接口的哈希表和连结列表实现,具有可预知的叠代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重连结列表。此连结列表定义了叠代顺序,该叠代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入 键,则插入顺序不受影响。(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中。)

基本介绍

  • 中文名:鍊表和哈希表实现
  • 外文名:LinkedHashMap

java.util.LinkedHashMap<K,V>

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 的不同之处在于,后者维护着一个运行于所有条目的双重连结列表。此连结列表定义了叠代顺序,该叠代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入 键,则插入顺序不受影响。(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中。)
此实现可以让客户避免未指定的、由 HashMap(及 Hashtable)所提供的通常为杂乱无章的排序工作,同时无需增加与 TreeMap 相关的成本。使用它可以生成一个与原来顺序相同的映射副本,而与原映射的实现无关:
void foo(Map m) { Map copy = new LinkedHashMap(m); ... } 如果模组通过输入得到一个映射,複製这个映射,然后返回由此副本确定其顺序的结果,这种情况下这项技术特别有用。(客户通常期望返回的内容与其出现的顺序相同。)
提供特殊的构造方法来创建连结哈希映射,该哈希映射的叠代顺序就是最后访问其条目的顺序,从近期访问最少到近期访问最多的顺序(访问顺序)。这种映射很适合构建 LRU 快取。调用 put 或 get 方法将会访问相应的条目(假定调用完成后它还存在)。putAll 方法以指定映射的条目集叠代器提供的键-值映射关係的顺序,为指定映射的每个映射关係生成一个条目访问。任何其他方法均不生成条目访问。特别是,collection 视图上的操作 影响底层映射的叠代顺序。
可以重写 removeEldestEntry(Map.Entry) 方法来实施策略,以便在将新映射关係添加到映射时自动移除旧的映射关係。
此类提供所有可选的 Map 操作,并且允许 null 元素。与 HashMap 一样,它可以为基本操作(add、contains 和 remove)提供稳定的性能,假定哈希函式将元素正确分布到桶中。由于增加了维护连结列表的开支,其性能很可能比 HashMap 稍逊一筹,不过这一点例外:LinkedHashMap 的 collection 视图叠代所需时间与映射的大小 成比例。HashMap 叠代时间很可能开支较大,因为它所需要的时间与其容量 成比例。
连结的哈希映射具有两个影响其性能的参数:初始容量载入因子。它们的定义与 HashMap 极其相似。要注意,为初始容量选择非常高的值对此类的影响比对 HashMap 要小,因为此类的叠代时间不受容量的影响。
注意,此实现不是同步的。如果多个执行绪同时访问连结的哈希映射,而其中至少一个执行绪从结构上修改了该映射,则它必须 保持外部同步。这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射的意外的非同步访问:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));结构修改是指添加或删除一个或多个映射关係,或者在按访问顺序连结的哈希映射中影响叠代顺序的任何操作。在按插入顺序连结的哈希映射中,仅更改与映射中已包含键关联的值不是结构修改。在按访问顺序连结的哈希映射中,仅利用 get 查询映射不是结构修改。
Collection(由此类的所有 collection 视图方法所返回)的 iterator 方法返回的叠代器都是快速失败 的:在叠代器创建之后,如果从结构上对映射进行修改,除非通过叠代器自身的 remove 方法,其他任何时间任何方式的修改,叠代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,叠代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。
注意,叠代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败叠代器会尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程式的方式是错误的,正确做法是:叠代器的快速失败行为应该仅用于检测程式错误。
此类是 Java Collections Framework 的成员。
  • 从以下版本开始:
  • 1.4
  • 另请参见:
  • Object.hashCode(), Collection, Map, HashMap, TreeMap, Hashtable, 序列化表格

方法摘要

方法摘要
void
clear()
从该映射中移除所有映射关係。
boolean
containsValue(Objectvalue)
如果此映射将一个或多个键映射到指定值,则返回 true。
V
get(Objectkey)
返回此映射到指定键的值。
protected boolean
removeEldestEntry(Map.Entry<K,V>eldest)
如果此映射移除其最旧的条目,则返回 true。
从类 java.util.HashMap继承的方法
clone, containsKey, entrySet, isEmpty, keySet, put, putAll, remove, size, values
从类 java.util.AbstractMap继承的方法
equals, hashCode, toString
从类 java.lang.Object继承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait
从接口 java.util.Map继承的方法
containsKey, entrySet, equals, hashCode, isEmpty, keySet, put, putAll, remove, size, values

构造方法详细

public LinkedHashMap(int initialCapacity, float loadFactor)
  • 构造一个带指定初始容量和载入因子的空插入顺序 LinkedHashMap 实例。
  • 参数:
  • initialCapacity - 初始容量
  • loadFactor - 载入因子
  • 抛出:
  • IllegalArgumentException - 如果初始容量为负或者载入因子为非正
public LinkedHashMap(int initialCapacity)
  • 构造一个带指定初始容量和默认载入因子 (0.75) 的空插入顺序 LinkedHashMap 实例。
  • 参数:
  • initialCapacity - 初始容量
  • 抛出:
  • IllegalArgumentException - 如果初始容量为负
public LinkedHashMap()
  • 构造一个带默认初始容量 (16) 和载入因子 (0.75) 的空插入顺序 LinkedHashMap 实例。
public LinkedHashMap(Map<? extends K,? extends V>m)
  • 构造一个映射关係与指定映射相同的插入顺序 LinkedHashMap 实例。所创建的 LinkedHashMap 实例具有默认的载入因子 (0.75) 和足以容纳指定映射中映射关係的初始容量。
  • 参数:
  • m - 要将其映射关係存放在此映射中的映射
  • 抛出:
  • NullPointerException - 如果指定的映射为 null
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
  • 构造一个带指定初始容量、载入因子和排序模式的空 LinkedHashMap 实例。
  • 参数:
  • initialCapacity - 初始容量
  • loadFactor - 载入因子
  • accessOrder - 排序模式 - 对于访问顺序,为 true;对于插入顺序,则为 false
  • 抛出:
  • IllegalArgumentException - 如果初始容量为负或者载入因子为非正
方法详细信息

containsValue

public boolean containsValue(Object value)
  • 如果此映射将一个或多个键映射到指定值,则返回 true。
  • 指定者:
  • 接口 Map<K,V> 中的 containsValue
  • 覆盖:
  • 类 HashMap<K,V> 中的 containsValue
  • 参数:
  • value - 其在此映射中的存在已经测试的值
  • 返回:
  • 如果此映射将一个或多个键映射到指定值,则返回 true

get

public V get(Object key)
  • 返回此映射到指定键的值。如果此映射中没有该键的映射关係,则返回 null 。
    更确切地讲,如果此映射包含满足 (key==null ? k==null : key.equals(k)) 的从键 k 到值 v 的映射关係,则此方法返回 v;否则,返回 null。(最多只能有一个这样的映射关係。)
    返回 null 值并不 一定 表明此映射不包含该键的映射关係;也可能此映射将该键显式地映射为 null。可使用 containsKey 操作来区分这两种情况。
  • 指定者:
  • 接口 Map<K,V> 中的 get
  • 覆盖:
  • 类 HashMap<K,V> 中的 get
  • 参数:
  • key - 要返回其关联值的键
  • 返回:
  • 指定键所映射的值;如果此映射不包含该键的映射关係,则返回 null
  • 另请参见:
  • HashMap.put(Object, Object)

clear

public void clear()
  • 从该映射中移除所有映射关係。此调用返回后映射将为空。
  • 指定者:
  • 接口 Map<K,V> 中的 clear
  • 覆盖:
  • 类 HashMap<K,V> 中的 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。
声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net