会,但只在特定组合下发生。基本类型与包装类用==比较时自动拆箱为数值比较;两个包装类间==比较不拆箱,直接比引用,受缓存影响;若包装类为null与基本类型比较会抛npe;推荐用objects.equals()避免问题。

会,但只在特定组合下发生。
基本类型与包装类混合比较时自动拆箱
当 基本类型 和 对应包装类 用 == 比较时(如 int == Integer),Java 会触发自动拆箱:编译器将包装类对象调用 xxxValue() 方法(例如 intValue())转为基本类型,再进行数值比较。
-
int a = 100; Integer b = 100; System.out.println(a == b);→b被拆箱为int,比较的是100 == 100,结果为true -
double d = 3.14; Double dd = 3.14; System.out.println(d == dd);→dd拆箱为double后比较,也返回true
两个包装类之间 == 比较不拆箱
当两个包装类对象比较(如 Integer == Integer),不会拆箱,而是直接比较引用地址。此时是否相等取决于是否指向同一对象,受缓存机制影响:
-
Integer a = 127, b = 127;→ 都从缓存复用,a == b为true -
Integer c = 128, d = 128;→ 各自新建对象,c == d为false
需要特别警惕的陷阱
如果参与比较的包装类变量为 null,而另一侧是基本类型,== 会强制拆箱,运行时抛出 NullPointerException:
-
Integer i = null; int x = 5; System.out.println(i == x);→ 报错:NPE -
Integer i = null; Integer j = null; System.out.println(i == j);→ 不报错,结果为true(都为 null 引用)
安全替代方案
避免歧义和 NPE,推荐统一使用:
-
Objects.equals(a, b):自动处理 null,语义清晰 - 显式判空 +
equals():a != null && a.equals(b) - 数值比较优先用基本类型,或确保包装类非 null 再拆箱
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











