Map 默认值:不存在与存在 null 要区分
配置查询里 get 返回 null,可能代表没有键,也可能代表这个键明确存了 null。直接套默认值,容易混淆这两种状态。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Java Tutorial for Beginners
Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
配置查询里 get 返回 null,可能代表没有键,也可能代表这个键明确存了 null。直接套默认值,容易混淆这两种状态。
理解核心机制
containsKey 判断键是否存在,getOrDefault 只在没有映射时返回默认值。computeIfAbsent 会把当前 null 映射视为需要计算,但其计算函数返回 null 时不会建立非空映射。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
import java.util.HashMap;
public class Demo {
public static void main(String[] args) {
var options = new HashMap<String, String>();
options.put("color", null);
System.out.println(options.getOrDefault("color", "green"));
System.out.println(options.getOrDefault("size", "medium"));
options.computeIfAbsent("color", key -> "blue");
System.out.println(options.get("color"));
}
}适用边界与常见误区
不同 Map 对 null 的支持不同,例如 ConcurrentHashMap 不允许 null 键和值。默认值方法也不自动让普通 HashMap 获得线程安全。
继续练习
为缺失键、null 值、空字符串分别建立样本,验证业务是否真的需要三种不同状态。