应使用 equals() 或 Objects.equals() 比较包装类数值是否相等,用 compareTo() 或解包后比较大小;禁用 ==,因其比较引用且受缓存影响(如 Integer -128~127 缓存),Boolean 虽全缓存也不建议 ==。

Java 中包装类(如 Integer、Long、Boolean 等)在比较大小时,若误用 ==,极易掉入“地址比较”陷阱——表面看是数值对比,实际比的是对象引用,结果不可靠。
别用 == 比较包装类的数值大小
== 对于包装类,判断的是两个引用是否指向**同一个对象**,而非数值是否相等。尤其在自动装箱(autoboxing)场景下,JVM 会对小范围整数做缓存(如 Integer 缓存 -128 ~ 127),导致相同值可能“碰巧” == 成立;超出范围则必然失败,造成隐蔽 bug。
例如:
Integer a = 100; Integer b = 100; System.out.println(a == b); // true(缓存内,共用同一对象) Integer c = 200; Integer d = 200; System.out.println(c == d); // false(缓存外,各自新建对象)
看似一样的写法,结果却不同——这不是语法错误,而是逻辑陷阱。
统一用 equals() 判断相等性(注意 null 安全)
要比较两个包装类对象的**数值是否相等**,应使用 equals() 方法。但需警惕 null 值引发 NullPointerException:
- 推荐写法:
Objects.equals(a, b)(Java 7+),自动处理 null - 手动判空:
a != null && a.equals(b) - 避免直接调用
a.equals(b)(若 a 为 null 会抛异常)
比较大小请用 compareTo() 或解包后用基本类型运算
要判断“谁大谁小”,不能依赖 ==,也不能仅靠 equals()(它只返回 true/false)。正确方式有两种:
- 调用包装类的
compareTo()方法(如a.compareTo(b) > 0表示 a > b),返回 int,可安全用于排序或条件判断 - 显式解包为基本类型再比较:
a.intValue() > b.intValue()—— 但前提是 a、b 非 null,否则 NPE - 更稳妥:先用
Objects.nonNull()校验,再解包或调用compareTo()
特殊提醒:Boolean 和其他包装类的缓存策略不同
Boolean 只缓存 true 和 false 两个实例,所以 Boolean.TRUE == Boolean.TRUE 总是 true;但依然不建议用 == 判等,理由同上——语义不清、易混淆、违反统一编码习惯。
Double、Float 的 == 行为更复杂(涉及 NaN、-0.0/+0.0),必须用 Double.compare(a, b) 或 Objects.equals()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











