WMX · 随记
·Java· 3 分钟阅读

Map 默认值:不存在与存在 null 要区分

配置查询里 get 返回 null,可能代表没有键,也可能代表这个键明确存了 null。直接套默认值,容易混淆这两种状态。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Tutorial for Beginners

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

配置查询里 get 返回 null,可能代表没有键,也可能代表这个键明确存了 null。直接套默认值,容易混淆这两种状态。

理解核心机制

containsKey 判断键是否存在,getOrDefault 只在没有映射时返回默认值。computeIfAbsent 会把当前 null 映射视为需要计算,但其计算函数返回 null 时不会建立非空映射。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java11 行 · 可横向滚动
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 值、空字符串分别建立样本,验证业务是否真的需要三种不同状态。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档