Java中基本类型与包装类比较的坑在于误用==(比引用而非值)和.equals()(可能空指针),需依场景选Objects.equals()、自动拆箱或null校验。

用 == 比较时:只适合基本类型之间,或确定非 null 的小整数包装类
基本类型用 == 是安全的,它直接比值。
但包装类用 == 比的是引用地址,不是数值——除非它们指向同一个缓存对象。
- Integer 在 -128 到 127 范围内会复用缓存对象,所以
Integer a = 100; Integer b = 100; a == b返回 true - 超出范围(如 200)就会新建对象:
Integer a = 200; Integer b = 200; a == b返回 false - Float、Double 的 valueOf 不做缓存,
Float a = 1.0f; Float b = 1.0f; a == b几乎总是 false - Boolean、Character 缓存范围有限(Character 是 \u0000–\u007f),别依赖
用 .equals() 比较时:推荐用于包装类之间,但必须防 null
.equals() 比的是数值逻辑(包装类已重写),但它会抛 NPE —— 如果左边是 null。
- 错:
Integer a = null; a.equals(10)→ 空指针异常 - 对:
Objects.equals(a, 10)→ 安全,自动处理 null - 也对:
10 == a(自动拆箱)→ 但若 a 为 null,仍会 NPE
混合比较(基本类型 vs 包装类):优先让包装类转成基本类型再比
比如 int i = 5; Integer j = 5;,下面几种写法效果不同:
立即学习“Java免费学习笔记(深入)”;
-
i == j→ 自动拆箱,安全(只要 j 不为 null) -
j == i→ 同样自动拆箱,等价 -
j.equals(i)→ 可行,因为 equals 接受 Object,会把 i 自动装箱再比(不推荐,多一次装箱) - 最稳妥:统一转成基本类型再比,或用
Objects.equals(i, j)
真实开发中建议的写法
- 判断是否相等:一律用
Objects.equals(a, b),兼容 null,语义清晰 - 做数值计算或条件判断前,先校验包装类是否为 null,或用 Optional 封装
- 集合里取值后参与运算,别直接拆箱:
Integer value = map.get("count"); if (value != null) { total += value; } - 数据库字段映射为包装类(如 Long id),比较时避免
id == 0L,改用Objects.equals(id, 0L)或id != null && id == 0L


















