Java中包装类相等判断必须用equals()而非==,因==比较引用地址且受缓存范围(-128~127)和null影响不可靠;推荐统一使用Objects.equals()保障null安全与语义正确。

Java 中对包装类(如 Integer、Boolean、Long 等)做相等判断时,必须用 equals(),而不是 ==。这是因为 == 比较的是引用是否指向同一对象,而 equals() 才是语义上的值相等判断——尤其当对象可能为 null 或来自不同创建路径时,== 极易出错。
为什么 == 在包装类上不可靠
== 对基本类型比较值,对引用类型比较内存地址。包装类是引用类型,即使两个 Integer 的值都是 100,它们也可能是不同对象:
- JVM 对
-128到127之间的整数做了缓存(通过Integer.valueOf()),此时用==偶尔“碰巧”成立,但这是实现细节,不可依赖; - 超出该范围(如
new Integer(200)或Integer.valueOf(200))会创建新对象,==必然返回false; -
null参与==不报错,但若用==判断null和一个包装类变量,逻辑容易混乱,且无法体现“值相等”的本意。
正确写法:统一用 equals()
推荐始终调用 Objects.equals(a, b),它内部已处理 null 安全:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
-
Objects.equals(Integer.valueOf(128), new Integer(128))→true; -
Objects.equals(null, someInteger)→false,不抛NullPointerException; - 比手写
a != null && a.equals(b)更简洁、不易遗漏。
特别注意自动拆箱陷阱
避免隐式调用 intValue() 等方法导致空指针:
- ❌
if (integerObj == 123):触发自动拆箱,integerObj为null时直接抛NullPointerException; - ❌
if (integerObj.intValue() == 123):同上,显式拆箱同样危险; - ✅
if (Objects.equals(integerObj, 123)):安全,且语义清晰。
布尔包装类的常见误用
Boolean 尤其典型——很多人写 if (flag == true),这既冗余又危险:
- 如果
flag是null,== true会拆箱失败; - 更自然、安全的写法是:
if (Boolean.TRUE.equals(flag))或if (Objects.equals(flag, Boolean.TRUE)); - 若业务逻辑明确非空,可直接
if (flag)(此时flag是boolean基本类型或已确保非空的Boolean)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










