Java Integer比较==时出现的不同结果分析

在Java中,我们有自动解包,和生成包的功能,而在int转化为Integer时我们会发现程序会将127以上的数值给一个False的结果,在127及以下的数值给一个True的结果。
下面是测试代码:
在这里插入图片描述

输出结果为:
在这里插入图片描述
查找资料后发现在为Integer类型的变量赋int类型值时,Java会自动将int类型转换为Integer类型,会调用value()方法返回一个Integer类型值,并将其赋值给变量a。这就是int的自动装箱。而在程序每次运行循环时都会触发Integer的自动装箱,而自动装箱会将int转换Integer类型值并返回;我们知道Java中两个new出来的对象因为是不同的两个实例,所以理论上会返回fasle。那么为什么在127以下的数据就会返回true了呢?
为此我又更改了了程序试图测试这个返回ture的范围在哪里:
在这里插入图片描述

而这个程序的结果显示在[-128,127]这个区间内返回均为true。再判断认为可能自动装箱在一些情况下并非为new出的新对象,然后查找资料在自动装箱引用的Integer.valueOf()的源码中,注释里就直接说明了-128到127之间的值都是直接从缓存中取出的。
在这里插入图片描述
从源码中看出它比较了int i 和IntegerCache.low以及IntegerCache.high的范围,如果在范围则由IntegerCache返回,如果不在,则new一个新对象。
那么为什么由IntegerCache返回就为同一对象了呢?那么再看看IntegerCache的源码:
在这里插入图片描述
从源码中可以看出对于-128到127之间的int类型,都是同一个Integer类型对象存储在cache[]中并返回。所以再-128到127的情况下就会返回同一缓存下的内容,为同一对象所以返回为ture。
除此之外还有别的自动装箱和自动拆箱的基本类型,其中有些也利用了缓存:

基本类型缓存范围
byte-128~127
short-128~127
int-128~127
long-128~127
char0~127
booleanture,false
float无缓存
double无缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值