java包装类比较应避免==,因其比较引用而非值;小整数(-128~127)因缓存可能误判相等,大数或float/double必不等;正确做法是用objects.equals()防npe,数值运算前需判空或用optional。

Java包装类对象比较最常踩的坑,是误用==判断值是否相等。它比的是引用(内存地址),不是数值本身,而包装类有缓存机制,导致小数字看似相等、大数字却判为不等——这叫“128陷阱”。正确做法始终用equals(),但要注意null安全。
别用 == 比较两个包装类对象
==只适合基本类型之间比较,或确认两个引用是否指向同一个对象。对包装类来说:
- 对于
Integer、Byte、Short、Long、Character,-128 到 127 范围内的值会复用缓存对象,==可能返回true;超出范围就新建对象,==一定返回false -
Float和Double没有缓存,==永远比较地址,几乎总为false(除非是同一个对象) -
Boolean只有true/false两个缓存实例,==碰巧能用,但风格不统一、易误导
优先用 equals(),但要防 null
equals()比较的是逻辑值,符合直觉。但自动拆箱前若对象为null,调用equals()不会出错,可一旦写成obj.equals(another)且obj为null,就会抛NullPointerException。
- 推荐写法:
Objects.equals(a, b)—— 它内部做了null判空,安全又简洁 - 如果不用工具类,把非
null对象放前面:nonNullObj.equals(other) - 避免
other.equals(nonNullObj)这种可能触发 NPE 的写法
需要数值计算时,先确保非 null 再拆箱
像a > b、a + b这类操作会触发自动拆箱。如果任一操作数为null,运行时直接报NullPointerException。
- 检查是否为
null再运算:if (a != null && b != null && a > b) { ... } - 或用
Optional封装:Optional.ofNullable(a).map(x -> x > b).orElse(false) - 数据库字段映射为
Integer时尤其注意:SQLNULL→ Javanull→ 拆箱即崩
特殊场景:明确需要引用一致性的判断
极少数情况真要判断是不是同一个对象(比如做轻量级状态标记、缓存键一致性校验),才用==。但必须清楚知道你在做什么,并加注释说明意图。
- 例如:
if (status == Status.ACTIVE),其中Status是枚举或单例常量 - 普通业务数值比较一律不适用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











