You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Integer对象同一性探究:为何不同数值用==判断结果有差异?

为什么Integer a=1000和Integer b=1000用==比较返回false?

这是个非常经典的Java Integer包装类问题,核心原因在于Integer的自动装箱缓存机制,咱们一步步拆解:

先看你的第一个例子

Integer a = 1; 
Integer b = a; 
System.out.println(a == b); // 返回true

这个很好理解:你把a的引用直接赋值给了b,两个变量指向的是同一个内存地址的Integer对象,用==比较引用地址自然是true。

关键在第二个例子的缓存机制

Java为了优化性能,默认对**-128到127之间的Integer对象做了缓存**。当你用自动装箱(也就是直接把int数值赋值给Integer变量)时:

  • 如果数值在-128 ~ 127范围内,Java会直接从缓存池里取出已经创建好的Integer对象,不会新建;
  • 如果数值超出这个范围,每次自动装箱都会创建一个全新的Integer对象。

回到你的代码:

Integer a = 1000; 
Integer b = 1000; 
System.out.println(a == b); // 返回false

1000明显超出了-128 ~ 127的缓存范围,所以a和b分别指向了两个不同的Integer对象,它们的内存地址不一样。而==对于对象类型来说,比较的是引用地址,不是实际的数值,所以结果就是false。

补充:正确的数值比较方式

如果要比较两个Integer的实际数值是否相等,应该用equals()方法,不管数值是否在缓存范围内,它都会比较对象内部的int值:

Integer a = 1000; 
Integer b = 1000; 
System.out.println(a.equals(b)); // 返回true

内容的提问来源于stack exchange,提问作者Christiaan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:08:44