Java中包装类值比较应统一用Objects.equals(),禁用==;需运算时先确保非null或设默认值,避免自动拆箱引发NPE。

Java 中比较操作里的自动装箱本身不直接导致误判,真正危险的是后续的 自动拆箱 和 == 误用。误判根源不是“装了箱”,而是把包装类当基本类型比、或在 null 参与下强行拆箱。核心对策是:值相等性判断一律走 Objects.equals(),禁用 ==,拆箱前先保 null 安全。
永远别用 == 比较两个包装类的值
Integer、Long、Boolean 等包装类用 == 比较,实际比的是对象地址,不是数值:
- -128 到 127 范围内的 Integer 可能因缓存复用而
==成立,但这是巧合,不可依赖 - 超出范围(如
Integer i = 200; Integer j = 200;),i == j几乎总是false -
new Integer(100) == Integer.valueOf(100)一定为false,构造器不走缓存
统一用 Objects.equals() 替代 equals() 和 ==
直接调用 a.equals(b) 有风险:若 a 为 null,会抛 NullPointerException;Objects.equals(a, b) 内部已处理所有 null 组合:
Objects.equals(null, null) → trueObjects.equals(null, 123) → falseObjects.equals(42, 42) → true
它语义清晰、null 安全,且不依赖缓存策略,是数值相等性判断的唯一推荐方式。
立即学习“Java免费学习笔记(深入)”;
涉及算术或条件判断时,先确保非 null 再拆箱
以下写法看似简洁,实则高危:
-
if (flag) { ... }→flag是Boolean且为null时,自动调用booleanValue()抛 NPE -
int x = obj.getValue() + 1;→ 若getValue()返回null,立刻崩溃 -
map.get("key") > 0→get返回null,拆箱失败
安全写法包括:
if (Boolean.TRUE.equals(flag)) { ... }int value = Objects.requireNonNullElse(obj.getValue(), 0);Integer v = map.get("key"); if (v != null && v > 0) { ... }
设计阶段就明确:该用基本类型还是包装类型
包装类只应在需要表达“缺失”语义(即 null)时使用:
- 数据库字段允许为空、API 响应字段可选、配置项未设置 → 用
Integer、Boolean等 - 计数器、循环变量、中间计算结果、确定不为空的参数 → 直接用
int、boolean - 混合比较(如
int a == Integer b)虽可编译,但隐含拆箱风险,应避免
不复杂但容易忽略。关键就一条:数值是否相等,交给 Objects.equals(a, b);需要参与运算,先确认非 null 或设默认值。


















