Module  java.base
软件包  java.util

Class LinkedHashMap<K,V>

  • 参数类型
    K - 由此地图维护的键的类型
    V - 映射值的类型
    All Implemented Interfaces:
    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之前立即调用。)

    此实施方式使其客户不受TreeMap (和Hashtable )提供的未指定的,通常混乱的排序,而不会导致与TreeMap相关的成本增加。 无论原始地图的实现如何,它都可用于生成与原始地图相同顺序的地图副本:

      void foo(Map m) {
             Map copy = new LinkedHashMap(m);
             ...
         } 
    如果模块在输入上进行映射,复制它,然后返回其顺序由该副本决定的结果,则此技术特别有用。 (客户一般都喜欢以相同的顺序返回事情。)

    提供了一个特殊的constructor ,用于创建一个链接的哈希映射,其迭代顺序是最后一次访问的条目的顺序,从最近最近被访问到最近的( 访问顺序 )。 这种地图非常适合建立LRU缓存。 调用putputIfAbsentgetgetOrDefaultcomputecomputeIfAbsentcomputeIfPresent ,或merge中的相应条目的接入方法的结果(假设调用完成后它存在)。 如果替换值,则replace方法仅导致条目的访问。 putAll方法按照指定地图的条目集迭代器提供的键值映射的顺序为指定地图中的每个映射生成一个条目访问。 没有其他方法生成条目访问。 特别地,对于集合视图的操作不会影响背景映射的迭代顺序。

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

    此类提供了所有可选的Map操作,并允许空元素。 HashMap ,它提供了基本操作(稳定的性能addcontainsremove ),假设散列函数散桶中适当的元件。 表现可能略低于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-bindingfail-fast ,另外报告Spliterator.ORDERED

    这个班是Java Collections Framework的会员。

    Implementation Note:
    由所有这个类的集合视图方法返回的集合的spliterator方法返回的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 - 如果指定的地图为空
      • 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>
        重写:
        containsValueHashMap<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>
        重写:
        getHashMap<K,V>
        参数
        key - 要返回其关联值的键
        结果
        指定键映射到的值,如果此映射不包含该键的映射, null
        另请参见:
        HashMap.put(Object, Object)
      • getOrDefault

        public V getOrDefault​(Object key,
                              V defaultValue)
        返回指定键映射到的值,如果此映射不包含该键的映射,则返回 defaultValue
        Specified by:
        getOrDefault在接口 Map<K,V>
        重写:
        getOrDefaultHashMap<K,V>
        参数
        key - 要返回其关联值的键
        defaultValue - 键的默认映射
        结果
        映射指定键的值,如果此映射不包含键的映射, defaultValue
      • clear

        public void clear​()
        从这张地图中删除所有的映射。 此呼叫返回后,地图将为空。
        Specified by:
        clear在接口 Map<K,V>
        重写:
        clearHashMap<K,V>
      • removeEldestEntry

        protected boolean removeEldestEntry​(Map.Entry<K,V> eldest)
        如果此地图应删除其最老的条目,则返回true 在将新条目插入到地图中后,此方法由putputAll调用。 它为实施者提供每次添加新的条目时删除最老条目的机会。 如果地图表示缓存,则此功能非常有用:它可以通过删除失效条目来减少内存消耗。

        示例使用:此覆盖将允许地图长达100个条目,然后每次添加新条目时删除最老条目,保持100个条目的稳定状态。

          private static final int MAX_ENTRIES = 100;
        
             protected boolean removeEldestEntry(Map.Entry eldest) {
                return size() > MAX_ENTRIES;
             } 

        该方法通常不会以任何方式修改地图,而是允许地图按其返回值的指示进行修改。 允许用于此方法来直接修改地图,但如果这样做的话,它必须返回false (指示地图不应试图任何进一步的修改)。 在此方法中修改地图后,返回true的效果未指定。

        这个实现只返回false (这样,这个地图就像一个普通的地图 - 最老的元素永远不会被删除)。

        参数
        eldest - 地图中最近插入的条目,或者如果这是访问顺序的地图,则是最近访问的条目。 这是将被删除的条目,此方法返回true 如果在引用此调用的putputAll调用之前地图为空,则将是刚插入的条目; 换句话说,如果地图包含单个条目,则最长条目也是最新的条目。
        结果
        true如果最长的条目应该从地图中删除; false如果应该保留。
      • keySet

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

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

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

        public void forEach​(BiConsumer<? super K,? super V> action)
        说明从接口Map复制
        对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。 除非实现类另有指定,否则按照进入设置迭代的顺序执行操作(如果指定了迭代顺序)。操作引发的异常被转发给调用者。
        Specified by:
        forEach接口 Map<K,V>
        重写:
        forEachHashMap<K,V>
        参数
        action - 为每个条目执行的操作
      • replaceAll

        public void replaceAll​(BiFunction<? super K,? super V,? extends V> function)
        描述从接口Map复制
        将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。 函数抛出的异常被转发给调用方。
        Specified by:
        replaceAll在接口 Map<K,V>
        重写:
        replaceAllHashMap<K,V>
        参数
        function - 应用于每个条目的功能