# Map接口及其子类的高效方法探索
Map 是编程中不可或缺的数据结构接口,其子类如 HashMap 和 ConcurrentHashMap 在日常开发中扮演着重要角色。熟悉 Map 接口提供的方法,等同于掌握了其子类的操作方法,无论这些子类是否支持并发操作。
自 JDK 8 起,Map 接口引入了一系列新方法,这些方法极大地增强了数据操作的便捷性和代码的可读性。随着 JDK 的演进,最新版本已经更新至 21,虽然 JDK 8 中新增的方法已不再“新颖”,但若未能熟练掌握,可能意味着你的技术栈已经“过时”。
## HashMap中常被忽视的高效方法
### 1. getOrDefault
**功能**:根据给定的键检索值,如果键不存在,则返回一个预设的默认值。
**示例代码**:
```java
Map map = new HashMap<>(4);
map.put("123", "123");
String key = "key";
String defaultValue = "defaultValue";
// 传统方式
String oldValue = defaultValue;
if (map.containsKey(key)) {
oldValue = map.get(key);
}
// 输出:defaultValue = defaultValue,realValue=null
System.out.println("defaultValue = " + oldValue + ",realValue=" + map.get(key));
// 优化方式
String newValue = map.getOrDefault(key, defaultValue);
// 输出:defaultValue = defaultValue,realValue=null
System.out.println("defaultValue = " + newValue + ",realValue=" + map.get(key));
优势:减少了对 containsKey
方法的显式调用,简化了代码逻辑。
2. forEach
功能:提供了一种更为便捷的方式来遍历 Map 中的键值对。
示例代码:
Map map = new HashMap<>(4);
map.put("111", "111");
// 传统方式
for (Map.Entry entry : map.entrySet()) {
System.out.printf("key = %s, value = %s%n", entry.getKey(), entry.getValue());
}
// 优化方式
map.forEach((key, value) -> System.out.printf("key = %s, value = %s%n", key, value));
优势:代码更加简洁,可以直接使用 Lambda 表达式进行操作。
3. merge
功能:用于合并键值对,根据指定的逻辑更新或插入值。
工作原理:如果键已存在,则应用合并函数计算新值并更新到 Map 中;如果键不存在,则直接将键值对插入到 Map 中。
示例代码:
Map map = new HashMap<>(8);
List list = Arrays.asList("a", "b", "c");
// 传统方式
for (String item : list) {
if (map.containsKey(item)) {
map.put(item, map.get(item) + 1);
} else {
map.put(item, 1);
}
}
System.out.println(map); // 输出:{a=1, b=1, c=1}
Map map1 = new HashMap<>(8);
// 优化方式
for (String item : list) {
map1.merge(item, 1, Integer::sum);
}
System.out.println(map1); // 输出:{a=1, b=1, c=1}
优势:仅需一行代码即可实现计数逻辑,避免了显式的检查,简化了复杂流程。
4. putIfAbsent
功能:仅当键不存在或其值为 null 时,才插入新的键值对。
示例代码:
Map map = new HashMap<>(4);
map.put("Jim", 5);
map.put("Lily", 10);
// 传统方式
if (!map.containsKey("Lily")) {
map.put("Lily", 10);
}
// 优化方式
map.putIfAbsent("Jim", 5);
System.out.println(map); // 输出:{Lily=10, Jim=5}
优势:避免了重复的检查逻辑,使代码更加直观。
5. compute
功能:允许通过函数对键对应的值进行动态计算。
典型应用场景:计数或根据复杂逻辑更新值。
示例代码:
```java
Map
List
// 传统方式
for (String item : list) {
if (map.containsKey(item)) {
map.put(item, map.get(item) +
相关文章
暂无评论...