Java包装类可空而基本类型不可空,判空必须显式检查;==比较包装类是引用比较,equals才是值比较;集合中null具业务意义,应合理处理而非规避。

Java 中包装类与基本数据类型之间的比较和判空问题,核心在于“类型语义不同”——一个是可空的对象引用,一个是不可空的确定值。处理不当,轻则逻辑错乱,重则运行时崩溃。
判空必须显式检查包装类,基本类型根本不存在“空”
int 类型变量声明后默认就是 0,永远不是 null;而 Integer 变量未赋值时是 null,直接参与运算或调用方法会触发 NullPointerException。
- ✅ 安全写法:先判空再使用
if (score != null) {
int value = score + 10; // 拆箱安全
}
- ❌ 危险写法:依赖自动拆箱
int value = score + 10; // 若 score 为 null,此处直接抛 NPE
- Boolean 类型尤其要小心:不能直接用于 if 条件判断
if (flag == Boolean.TRUE) { ... } // 推荐
// 不要用 if (flag) —— flag 为 null 时会 NPE
比较操作:== 和 equals 的行为差异极大
用 == 比较两个包装类,实际比较的是对象引用(地址),不是数值;而 equals 才是语义上“值相等”的正确方式(但要注意 null 安全)。
- Integer a = 100, b = 100; System.out.println(a == b); // true(缓存内复用同一对象)
- Integer c = 200, d = 200; System.out.println(c == d); // false(超出缓存范围,新建对象)
- 推荐统一用 equals,但需防 null:
- 与基本类型比较时,用 == 是安全的(自动拆箱后比值):
if (x == 42) { ... } // ✅ 合法且常用(x 自动拆箱为 int)
集合与泛型场景下,null 是常见且合理的状态
Map
立即学习“Java免费学习笔记(深入)”;
- 从 Map 或 JSON 解析获取 Integer 时,优先接受 null,再按需转换
- 需要默认值?用 Optional 或三元表达式更清晰:
// 或
int actualScore = score != null ? score : 0;
- 避免滥用自动装箱掩盖 null 风险,比如在 stream 操作中:
字符串 ↔ 包装类转换时,注意 valueOf 与 parseInt 的分工
valueOf 返回包装类对象(可能复用缓存),parseInt 返回基本类型(不涉及 null,但抛异常)。
- String → Integer 对象(允许后续判空):Integer i = Integer.valueOf("123");
- String → int 值(需 try-catch 处理非法输入):int n = Integer.parseInt("123");
- String 为空或 null 时,valueOf 返回 null;parseInt 直接抛 NumberFormatException
return s == null || s.trim().isEmpty() ? null : Integer.valueOf(s);
}


















