跳到主要内容

Java LinkedHashMap

提示
  1. LinkedHashMap 的基本特性LinkedHashMap 类是 Java 集合框架的一部分,提供了基于哈希表和链表的 Map 接口实现。它通过内部维护的双向链表来保持条目的插入顺序。
  2. 创建和使用 LinkedHashMap:可以通过指定初始容量和负载因子来创建 LinkedHashMap,并可选择条目排序方式(插入顺序或访问顺序)。它支持常见的映射操作,如 put(), get(), remove(), 和 clear() 等。
  3. LinkedHashMap 与 HashMap 的差异:与 HashMap 相比,LinkedHashMap 额外维护元素的顺序,因此占用更多内存并可能有稍慢的性能。然而,它可以保证元素的迭代顺序与插入顺序一致。

Java 集合框架的 LinkedHashMap 类提供了 Map 接口的哈希表和链表实现。

LinkedHashMap 接口扩展了 HashMap 类,以在哈希表中存储其条目。它在所有条目之间内部维护一个双向链表,以对其条目进行排序。

Java LinkedHashMap 类扩展了 HashMap 类。

创建 LinkedHashMap

为了创建一个链接哈希映射,我们首先必须导入 java.util.LinkedHashMap 包。一旦我们导入了包,以下是我们在 Java 中创建链接哈希映射的方法。

// 初始容量为 8 和负载因子为 0.6 的 LinkedHashMap
LinkedHashMap<Key, Value> numbers = new LinkedHashMap<>(8, 0.6f);

在上面的代码中,我们创建了一个名为 numbers 的链接哈希映射。

这里,

  • Key - 用于关联映射中每个元素(值)的唯一标识符
  • Value - 映射中由键关联的元素

注意 new LinkedHashMap<>(8, 0.6) 这部分。这里,第一个参数是 容量,第二个参数是 负载因子

  • 容量 - 这个链接哈希映射的容量是 8。意味着它可以存储 8 个条目。
  • 负载因子 - 这个链接哈希映射的负载因子是 0.6。这意味着,每当我们的哈希映射填充到 60% 时,条目就会被移动到一个新的哈希表中,该哈希表的大小是原哈希表的两倍。

默认容量和负载因子

我们可以创建一个没有定义容量和负载因子的链接哈希映射。例如,

// 默认容量和负载因子的 LinkedHashMap
LinkedHashMap<Key, Value> numbers1 = new LinkedHashMap<>();

默认情况下,

  • 链接哈希映射的容量将是 16
  • 负载因子将是 0.75

注意LinkedHashMap 类还允许我们定义其条目的顺序。例如

// 指定顺序的 LinkedHashMap
LinkedHashMap<Key, Value> numbers2 = new LinkedHashMap<>(capacity, loadFactor, accessOrder);

这里,accessOrder 是一个布尔值。其默认值为 false。在这种情况下,链接哈希映射中的条目按照它们的插入顺序排序。

然而,如果传递 true 作为 accessOrder,则链接哈希映射中的条目将按照最近最少访问到最近最多访问的顺序排序。

从其他映射创建 LinkedHashMap

以下是我们如何创建包含其他映射所有元素的链接哈希映射。

import java.util.LinkedHashMap;

class Main {
public static void main(String[] args) {
// 创建偶数的 LinkedHashMap
LinkedHashMap<String, Integer> evenNumbers = new LinkedHashMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
System.out.println("LinkedHashMap1: " + evenNumbers);

// 从其他 LinkedHashMap 创建 LinkedHashMap
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 类提供了允许我们对映射执行各种操作的方法。

向 LinkedHashMap 插入元素

  • put() - 向映射中插入指定的键/值映射
  • putAll() - 将指定映射中的所有条目插入此映射
  • putIfAbsent() - 如果指定的键在映射中不存在,则将指定的键/值映射插入映射中

例如,


import java.util.LinkedHashMap;

class Main {
public static void main(String[] args) {
// 创建偶数的 LinkedHashMap
LinkedHashMap<String, Integer> evenNumbers = new LinkedHashMap<>();

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

// 使用 putIfAbsent()
evenNumbers.putIfAbsent("Six", 6);
System.out.println("更新后的 LinkedHashMap(): " + evenNumbers);

// 创建数字的 LinkedHashMap
LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
numbers.put("One", 1);

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

输出

原始 LinkedHashMap: {Two=2, Four=4}
更新后的 LinkedHashMap: {Two=2, Four=4, Six=6}
新的 LinkedHashMap: {One=1, Two=2, Four=4, Six=6}

访问 LinkedHashMap 元素

1. 使用 entrySet(), keySet() 和 values()

  • entrySet() - 返回映射中所有键/值映射的集合
  • keySet() - 返回映射中所有键的集合
  • values() - 返回映射中所有值的集合

例如,

import java.util.LinkedHashMap;

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("键/值映射: " + numbers.entrySet());

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

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

输出

LinkedHashMap: {One=1, Two=2, Three=3}
/值映射: [One=1, Two=2, Three=3]
: [One, Two, Three]
: [1, 2, 3]

2. 使用 get() 和 getOrDefault()

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

例如,

import java.util.LinkedHashMap;

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("返回的数字: " + value1);

// 使用 getOrDefault()
int value2 = numbers.getOrDefault("Five", 5);
System.out.println("返回的数字: " + value2);
}
}

输出

LinkedHashMap: {One=1, Two=2, Three=3}
返回的数字: 3
返回的数字: 5

移除 LinkedHashMap 元素

  • remove(key) - 返回并移除与指定 key 关联的条目
  • remove(key, value) - 仅当指定 key 映射到指定 value 时移除条目,并返回一个布尔值

例如,

import java.util.LinkedHashMap;

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);

// 带单个参数的 remove 方法
int value = numbers.remove("Two");
System.out.println("移除的值: " + value);

// 带两个参数的 remove 方法
boolean result = numbers.remove("Three", 3);
System.out.println("是否移

除了 Three 条目? " + result);

System.out.println("更新后的 LinkedHashMap: " + numbers);
}
}

输出

LinkedHashMap: {One=1, Two=2, Three=3}
移除的值: 2
是否移除了 {Three=3} 条目? True
更新后的 LinkedHashMap: {One=1}

LinkedHashMap 的其他方法

方法描述
clear()移除映射中的所有条目
containsKey()检查映射是否包含指定的键,并返回布尔值
containsValue()检查映射是否包含指定的值,并返回布尔值
size()返回映射的大小
isEmpty()检查映射是否为空,并返回布尔值

LinkedHashMap 与 HashMap 的区别

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

  • LinkedHashMap 内部维护一个双向链表。因此,它维护了其元素的插入顺序。
  • LinkedHashMap 类比 HashMap 需要更多的存储空间。这是因为 LinkedHashMap 内部维护了链表。
  • LinkedHashMap 的性能比 HashMap 慢。