251. Java 集合 - 管理 Map 的内容
1. ➕ 向 Map 添加键值对
在 Map 中添加数据非常简单:
- 使用
put(key, value)方法 - 如果键不存在,就直接添加新的键值对。
- 如果键已存在,则用新的值替换旧值。
🧠 小知识
put()方法总是返回这个键之前绑定的值。- 如果是新增的键,那么返回的是
null。
📖 示例:使用 put()
import java.util.HashMap;
import java.util.Map;
public class PutExample {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
String oldValue = map.put("apple", "red");
System.out.println("Old value for 'apple': " + oldValue); // null
oldValue = map.put("apple", "green");
System.out.println("Old value for 'apple': " + oldValue); // red
}
}
✅ 总结:
- 第一次添加
"apple",返回null - 第二次添加
"apple",原来绑定的"red"被返回,并且值更新为"green"
2. ✨ 使用 putIfAbsent() 更智能地添加
Java 8 新增了 putIfAbsent(key, value) 方法:
- 仅当这个键不存在或对应值为 null时,才添加新的键值对!
- 如果已有非空值,则保持不变。
🚨 注意
如果某个键已经存在,但值是 null,putIfAbsent() 也会将其替换成新的值!
📖 示例:使用 putIfAbsent()
import java.util.HashMap;
import java.util.Map;
public class PutIfAbsentExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", null);
map.put("three", 3);
map.putIfAbsent("two", 2); // "two" 的值是 null,因此会被替换
map.putIfAbsent("three", 33); // "three" 已经是 3,不会替换
System.out.println(map);
}
}
输出:
{one=1, two=2, three=3}
3. ❗ 注意:null 值导致的问题
假设 Map 中存在一些 null 值,直接遍历可能导致空指针异常(NullPointerException)!
📖 错误示例:
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", null);
for (int value : map.values()) { // 自动拆箱 Integer -> int
System.out.println("value = " + value);
}
null无法自动拆箱为int,程序运行时报错!
✅ 解决方案:用 putIfAbsent() 替换掉 null
for (String key : map.keySet()) {
map.putIfAbsent(key, -1); // 将所有为 null 的值替换成 -1
}
这样,遍历时不会再出现异常!
最终输出示例:
value = 1
value = -1
4. 🔍 从 Map 中获取值
可以通过 get(key) 获取指定键对应的值。
如果键不存在,get() 返回 null。
✨ 使用 getOrDefault()
Java 8 新增 getOrDefault(key, defaultValue) 方法:
- 如果键存在,返回对应的值;
- 如果键不存在,返回指定的默认值!
📖 示例:使用 getOrDefault()
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GetOrDefaultExample {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
List<String> values = new ArrayList<>();
for (int key = 0; key < 5; key++) {
values.add(map.getOrDefault(key, "UNDEFINED"));
}
System.out.println(values);
}
}
输出:
[UNDEFINED, one, two, three, UNDEFINED]
5. 🌟 使用 Stream 简化写法(可选进阶)
如果你已经熟悉 Java Stream API,可以用更优雅的方式实现相同功能:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class StreamGetOrDefault {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
List<String> values = IntStream.range(0, 5)
.mapToObj(key -> map.getOrDefault(key, "UNDEFINED"))
.collect(Collectors.toList());
System.out.println(values);
}
}
输出同样是:
[UNDEFINED, one, two, three, UNDEFINED]
✅ 更加简洁高效!
🎯 小结
| 方法 | 说明 |
|---|---|
put(key, value) | 添加或更新键值对 |
putIfAbsent(key, value) | 仅在键不存在或值为 null 时添加 |
get(key) | 获取指定键的值,键不存在返回 null |
getOrDefault(key, defaultValue) | 获取指定键的值,键不存在返回默认值 |
👀 互动问题
问题1:put() 方法返回的是什么?
答案示例:返回的是原来绑定到该键的旧值,如果没有旧值则返回 null。
问题2:putIfAbsent() 和 put() 有什么区别?
答案示例:
putIfAbsent()只有在键不存在或对应值是 null 时才会添加;put()则总是覆盖。
问题3:为什么遍历时 null 值会导致空指针异常?
答案示例:因为遍历时需要自动拆箱为基本类型(int),而 null 无法拆箱,会抛出 NullPointerException。