2个Integer类型的数据值是相同,但是为什么不相等

本文揭示了Java中Integer类型隐含的缓存机制,当你在-128至+127范围内使用自动装箱时,看似相同的数值可能因为缓存导致不相等。了解Integer Cache并学会使用equals方法解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题的出现:

在项目中,我拿到了传过来的参数,然后跟数据库中的数据进行匹配时,竟然发现2个Integer类型的数据不相等,明明2个值是一模一样的,但是使用=时,竟然是不相等

前提知识

1)在java中,==比较的是对象引用,而equals比较的是值
2)java的自动装箱、自动拆箱
自动装箱:将基本数据类型转换为对应的包装类
自动拆箱:将包装类转换为基本数据类型
基本数据类型跟包装类对应如下
基本数据类型 包装类
byte Byte
boolean Boolean
short Short
char Character
int Integer
long Long
float Float
double Double

Integer a =1等价于 Integer a=Integer.valueOf(1)
Integer a =10,int b=a等价于Integer a =10,int b=a.intValue();

自动装箱都是通过包装类的 valueOf() 方法来实现的.
自动拆箱都是通过包装类对象的 xxxValue() 来实现的。

问题解决

通过查找资料,Integer是存在缓存机制的,如果在java6后不去设置java.lang.Integer.IntegerCache.high,默认范围区间是-128 至 +127。

在-128 至 +127范围外,自动装箱功能将Integer a=1024等价于Integer a=new Integer(1024),所以使用=会导致数据不相等,只能使用equals

参考资料:
https://hollischuang.gitee.io/tobetopjavaer/#/basics/java-basic/boxing-unboxing
https://hollischuang.gitee.io/tobetopjavaer/#/basics/java-basic/integer-cache

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值