Java LinkedHashMap
LinkedHashMap 是保存了元素插入顺序的 HashMap。在本教程中,我们将通过示例了解 Java LinkedHashMap 类及其用法。
在本教程中,我们将通过示例了解 Java LinkedHashMap 类及其用法。
LinkedHashMap
类继承自 HashMap
类,在 HashMap
类实现的基础上,在内部维护双向链表以保持条目的插入顺序。可以说,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
: 排序模式排序模式指示如何排序元素。当
accessOrder
为false
时,按照元素的插入顺序排序;当accessOrder
为true
时,按照元素的访问顺序排序,最晚访问的靠后,最早访问的靠前。
从其他 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
LinkedHashMap
和 HashMap
都实现了 Map
接口。但是,它们之间存在一些差异。
LinkedHashMap
在内部维护一个双向链表。因此,它保持其元素的插入顺序。LinkedHashMap
比HashMap
占用更多的存储空间,因为LinkedHashMap
在内部维护一个链表。LinkedHashMap
的性能比HashMap
慢。