Java LinkedHashMap类

时间:2020-02-23 14:36:31  来源:igfitidea点击:

Java中的LinkedHashMap

  • 它是Java Collections Framework的一部分。

  • LinkedHashMap是Map接口的哈希表和链接列表实现。

  • LinkedHashMap扩展了HashMap类。

  • LinkedHashMap保持插入顺序。
    因此,在迭代其键时,将按插入顺序返回元素。

  • LinkedHashMap使用双向链接列表来维护插入顺序。

  • 如果重新插入密钥,则其插入顺序不会受到影响。

  • 当您想要一个地图时,我们可以按插入顺序遍历条目,但又不想处理与TreeMap相关的另外开销时,这很有用。

  • LinkedHashMap允许键和值的空条目。
    可以有一个null键和多个null值。

  • LinkedHashMap不是线程安全的。
    如果要在多线程环境中使用它,则可以使用Collections.synchronizedMap()方法在其上创建一个同步包装器。

LinkedHashMap构造函数

LinkedHashMap类中有5个构造函数。

LinkedHashMap构造函数

  • LinkedHashMap():使用默认的初始容量(16)和负载因子(0.75)创建一个空的LinkedHashMap实例。

  • LinkedHashMap(int initialCapacity):使用给定的初始容量和负载因子(0.75)创建一个空的LinkedHashMap实例。
    如果initialCapacity为负,则抛出IllegalArgumentException

  • LinkedHashMap(int initialCapacity,float loadFactor):使用给定的初始容量和负载因子创建一个空的LinkedHashMap实例。
    如果初始容量为负或者负载系数为正,则抛出IllegalArgumentException。

  • LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder):使用给定的初始容量,负载因子和订购方式创建一个空的LinkedHashMap。
    如果accessOrder为true –排序模式为access-order,否则为insert-order。

  • LinkedHashMap(Map <?扩展K,?扩展V> m):创建插入顺序的LinkedHashMap实例,该实例具有与指定映射相同的映射。
    如果给定的映射为null,则抛出NullPointerException。

这是一个简单的示例,用于确认LinkedHashMap维护其键的插入顺序。

package com.theitroad.examples;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapExamples {

	public static void main(String[] args) {

		Map<Integer, String> vowelsMap = new HashMap<>();
		vowelsMap.put(1, "a");
		vowelsMap.put(2, "e");
		vowelsMap.put(5, "u");
		vowelsMap.put(4, "o");
		vowelsMap.put(3, "i");

		vowelsMap.forEach((k, v) -> System.out.println("[" + k + "," + v + "]"));

		LinkedHashMap<Integer, String> lhm = new LinkedHashMap<>();
		lhm.put(1, "A");
		lhm.put(2, "E");
		lhm.put(5, "U");
		lhm.put(4, "O");
		lhm.put(3, "I");

		lhm.forEach((k, v) -> System.out.println("[" + k + "," + v + "]"));
	}
}

输出:

[1,a]
[2,e]
[3,i]
[4,o]
[5,u]

[1,A]
[2,E]
[5,U]
[4,O]
[3,I]

LinkedHashMap方法

LinkedHashMap类没有专用方法。
它通过扩展使用HashMap类中的方法。
但是,对于条目的插入顺序,某些方法被覆盖。

  • containsValue(Object value):利用LinkedList方法获得更快的分辨率。

  • get(对象键),getOrDefault(对象键,V defaultValue)

  • 明确()

  • keySet():返回LinkedKeySet的实例。

  • forEach(),replaceAll():利用链表实现方法进行插入顺序迭代和更快的处理。

LinkedHashMap和HashMap

  • LinkedHashMap扩展了HashMap类。
    因此,HashMap是LinkedHashMap类的超类。

  • LinkedHashMap保持插入顺序,而HashMap则不保持条目的任何顺序。

  • 在LinkedHashMap条目上进行迭代始终会产生相同的元素序列。
    遍历HashMap条目可能会产生随机序列,因为不维护顺序。

  • LinkedHashMap的性能比维护HashMap的性能稍低,这归因于维护链表的开销增加,但有一个例外:对LinkedHashMap的集合视图进行迭代需要的时间与地图的大小成正比,而不论其容量如何。
    在HashMap上进行迭代可能会更昂贵,需要的时间与其容量成正比。

LinkedHashMap与TreeMap

如果要按插入顺序访问Map元素,建议使用LinkedHashMap。
它具有快速的性能,并且不会增加与TreeMap相关的成本。