Java LinkedHashMap

LinkedHashMap 是保存了元素插入顺序的 HashMap。在本教程中,我们将通过示例了解 Java LinkedHashMap 类及其用法。

在本教程中,我们将通过示例了解 Java LinkedHashMap 类及其用法。

LinkedHashMap 类继承自 HashMap,在 HashMap 类实现的基础上,在内部维护双向链表以保持条目的插入顺序。可以说,LinkedHashMap 是保存了元素插入顺序的 HashMap

Java LinkedHashMap 类扩展了 HashMap 类。

创建 LinkedHashMap

我们导入 java.util.LinkedHashMap 类后,就可以通过构造方法创建 LinkedHashMap 对象了。例如:

LinkedHashMap<Key, Value> numbers = new LinkedHashMap<>();

这里,

  • Key - Map 中键的数据类型
  • Value - Map 中值的数据类型

LinkedHashMap 构造函数

LinkedHashMap 重载了 5 个构造方法:

LinkedHashMap()
LinkedHashMap(int initialCapacity)
LinkedHashMap(int initialCapacity, float loadFactor)
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
LinkedHashMap(Map<? extends K, ? extends V> m)

参数说明:

  • initialCapacity: 初始容量

    Map 的初始容量,默认值为 16

  • loadFactor: 负载因子

    负载因子,默认值 0.75f。用来指示何时对底层容器扩容。

    比如容量时 16, 负载因子 0.75f, 那么使用量超过 16 * 0.75 = 12 的时候,就要扩容。

  • accessOrder: 排序模式

    排序模式指示如何排序元素。当 accessOrderfalse 时,按照元素的插入顺序排序;当 accessOrdertrue 时,按照元素的访问顺序排序,最晚访问的靠后,最早访问的靠前。

从其他 Map 创建 LinkedHashMap

下面例子我们从一个 Map 对象中的所有条目初始化一个 LinkedHashMap。

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

public class Main {
  public static void main(String[] args) {
    Map<String, Integer> evenNumbers = new HashMap<>();
    evenNumbers.put("Two", 2);
    evenNumbers.put("Four", 4);
    System.out.println("LinkedHashMap1: " + evenNumbers);

    LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>(evenNumbers);
    numbers.put("Three", 3);
    System.out.println("LinkedHashMap2: " + numbers);
  }
}

输出

LinkedHashMap1: {Two=2, Four=4}
LinkedHashMap2: {Two=2, Four=4, Three=3}

LinkedHashMap 的方法

LinkedHashMap 类实现了各种操作 Map 的方法。

插入元素

  • put() - 将指定的键值对条目插入到 Map 中
  • putAll() - 将指定 Map 中的所有条目插入到 Map 中
  • putIfAbsent() - 如果 Map 中不存在指定的键,则将指定的键值对条目插入到 Map 中

例如,

import java.util.LinkedHashMap;

public class Main {
  public static void main(String[] args) {
    LinkedHashMap<String, Integer> evenNumbers = new LinkedHashMap<>();

    // 使用 put()
    evenNumbers.put("Two", 2);
    evenNumbers.put("Four", 4);
    System.out.println("Original LinkedHashMap: " + evenNumbers);

    // 使用 putIfAbsent()
    evenNumbers.putIfAbsent("Six", 6);
    System.out.println("Updated LinkedHashMap(): " + evenNumbers);

    // 创建另一个 LinkedHashMap
    LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
    numbers.put("One", 1);

    // 使用 putAll()
    numbers.putAll(evenNumbers);
    System.out.println("New LinkedHashMap: " + numbers);
  }
}

输出

Original LinkedHashMap: {Two=2, Four=4}
Updated LinkedHashMap(): {Two=2, Four=4, Six=6}
New LinkedHashMap: {One=1, Two=2, Four=4, Six=6}

entrySet()、keySet() 和 values()

  • entrySet() - 返回 Map 的所有键值对条目的 Set 集合
  • keySet() - 返回 Map 的所有键的 Set 集合
  • values() - 返回 Map 的所有值的集合

例如,

import java.util.LinkedHashMap;

public class Main {
  public static void main(String[] args) {
    LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();

    numbers.put("One", 1);
    numbers.put("Two", 2);
    numbers.put("Three", 3);
    System.out.println("LinkedHashMap: " + numbers);

    // 使用 entrySet()
    System.out.println("Key/Value mappings: " + numbers.entrySet());

    // 使用 keySet()
    System.out.println("Keys: " + numbers.keySet());

    // 使用 values()
    System.out.println("Values: " + numbers.values());
  }
}

输出

LinkedHashMap: {One=1, Two=2, Three=3}
Key/Value mappings: [One=1, Two=2, Three=3]
Keys: [One, Two, Three]
Values: [1, 2, 3]

get() 和 getOrDefault()

  • get() - 返回与指定键关联的值。如果未找指定键,则返回 null
  • getOrDefault() - 返回与指定键关联的值。如果未找到该键,则返回指定的默认值。

例如,

import java.util.LinkedHashMap;

public class Main {
  public static void main(String[] args) {

    LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
    numbers.put("One", 1);
    numbers.put("Two", 2);
    numbers.put("Three", 3);
    System.out.println("LinkedHashMap: " + numbers);

    // 使用 get()
    int value1 = numbers.get("Three");
    System.out.println("Returned Number: " + value1);

    // 使用 getOrDefault()
    int value2 = numbers.getOrDefault("Five", 5);
    System.out.println("Returned Number: " + value2);
  }
}

输出

LinkedHashMap: {One=1, Two=2, Three=3}
Returned Number: 3
Returned Number: 5

删除 LinkedHashMap 元素

  • remove(key) - 删除并返回与指定键关联的条目
  • remove(key, value) - 删除与指定键和指定值匹配的条目,成功返回 true,否则返回 false

例如,

import java.util.LinkedHashMap;

public class Main {
  public static void main(String[] args) {

    LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
    numbers.put("One", 1);
    numbers.put("Two", 2);
    numbers.put("Three", 3);
    System.out.println("LinkedHashMap: " + numbers);

    // 根据键删除条目
    int value = numbers.remove("Two");
    System.out.println("Removed value: " + value);

    // 根据键和值删除条目
    boolean result = numbers.remove("Three", 3);
    System.out.println("Is the entry Three removed? " + result);

    System.out.println("Updated LinkedHashMap: " + numbers);
  }
}

输出

LinkedHashMap: {One=1, Two=2, Three=3}
Removed value: 2
Is the entry Three removed? true
Updated LinkedHashMap: {One=1}

LinkedHashMap 的其他方法

  • clear(): 从 Map 中删除所有条目
  • containsKey(): 检查 Map 是否包含指定的键
  • containsValue(): 检查 Map 是否包含指定的值
  • size(): 返回 Map 的大小
  • isEmpty(): 检查 Map 是否为空

LinkedHashMap 与 HashMap

LinkedHashMapHashMap 都实现了 Map 接口。但是,它们之间存在一些差异。

  • LinkedHashMap 在内部维护一个双向链表。因此,它保持其元素的插入顺序。
  • LinkedHashMapHashMap 占用更多的存储空间,因为 LinkedHashMap 在内部维护一个链表。
  • LinkedHashMap 的性能比 HashMap 慢。