模块  java.base
软件包  java.util

Class LinkedHashMap<K,​V>

  • 参数类型
    K - 此映射维护的密钥类型
    V - 映射值的类型
    实现的所有接口
    SerializableCloneableMap<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缓存。 调用putputIfAbsentgetgetOrDefaultcomputecomputeIfAbsentcomputeIfPresent ,或merge中的相应条目的接入方法的结果(假设调用完成后它存在)。 如果替换值,则replace方法仅导致访问条目。 putAll方法为指定映射中的每个映射生成一个条目访问,按照指定映射的条目集迭代器提供键 - 值映射的顺序。 没有其他方法可以生成条目访问。 特别是,对集合视图的操作不会影响后备映射的迭代顺序。

    可以重写removeEldestEntry(Map.Entry)方法,以便在将新映射添加到地图时自动删除过时映射的策略。

    此类提供所有可选的Map操作,并允许null元素。 HashMap ,它提供了基本操作(稳定的性能addcontainsremove ),假设散列函数散桶中适当的元件。 由于维护链表的额外费用,性能可能略低于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()CollectionMapHashMapTreeMapHashtableSerialized Form
    • 构造方法详细信息

      • 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操作来区分这两种情况。

        Specified by:
        get在界面 Map<K,​V>
        重写:
        get在类 HashMap<K,​V>
        参数
        key - 要返回其关联值的键
        结果
        指定键映射到的值,如果此映射不包含键的映射, null
        另请参见:
        HashMap.put(Object, Object)
      • removeEldestEntry

        protected boolean removeEldestEntry​(Map.Entry<K,​V> eldest)
        如果此地图应删除其最true则返回true 在将新条目插入地图后,由putputAll调用此方法。 它为实现者提供了在每次添加新条目时删除最旧条目的机会。 如果映射表示高速缓存,则此选项非常有用:它允许映射通过删除过时条目来减少内存消耗。

        示例使用:此覆盖将允许地图增长到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 如果在putputAll调用之前映射为空,从而导致此调用,则这将是刚刚插入的条目; 换句话说,如果地图包含单个条目,则最老的条目也是最新的。
        结果
        true如果应从地图中删除最年长的条目; false是否应该保留。
      • keySet

        public Set<K> keySet()
        返回此映射中包含的键的Set视图。 该集由地图支持,因此对地图的更改将反映在集中,反之亦然。 如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.removeSet.removeremoveAllretainAll ,和clear操作。 它不支持addaddAll操作。 Spliterator通常提供更快的顺序性能,但比HashMap并行性能差HashMap
        Specified by:
        keySet在界面 Map<K,​V>
        重写:
        keySet在类 HashMap<K,​V>
        结果
        此映射中包含的键的设置视图
      • values

        public Collection<V> values()
        返回此映射中包含的值的Collection视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该collection支持元素移除,即从映射中相应的映射,经由Iterator.removeCollection.removeremoveAllretainAllclear操作。 它不支持addaddAll操作。 它的Spliterator通常提供更快的顺序性能,但并行性能比HashMap
        Specified by:
        values ,界面 Map<K,​V>
        重写:
        values在类 HashMap<K,​V>
        结果
        此映射中包含的值的视图
      • entrySet

        public Set<Map.Entry<K,​V>> entrySet()
        返回此映射中包含的映射的Set视图。 该集由地图支持,因此对地图的更改将反映在集中,反之亦然。 如果在对集合进行迭代时修改了映射(除非通过迭代器自己的remove操作,或者通过迭代器返回的映射条目上的setValue操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.removeSet.removeremoveAllretainAllclear操作。 它不支持addaddAll操作。 Spliterator通常提供更快的顺序性能,但并行性能比HashMapHashMap
        Specified by:
        entrySet在界面 Map<K,​V>
        重写:
        entrySet在类 HashMap<K,​V>
        结果
        此映射中包含的映射的set视图