常量缓存与integer比较_Integer和int使用==进行比较大小时的坑

本文深入解析了Java中Integer对象与int值的比较,包括Integer的缓存机制、拆箱过程以及==和equals()的区别。在-128到127之间,Integer对象会进行缓存,导致==比较返回true,超出此范围则每次都会创建新对象,导致==比较返回false。使用equals()方法可以比较Integer对象的值是否相等。
摘要由CSDN通过智能技术生成

先看一个例子:

public static void main(String[] args) {

int i1 = 128;

Integer i2 = 128;

Integer i3 = new Integer(128);

System.out.println(i1 == i2);//true

System.out.println(i1 == i3);//true

System.out.println("**************************************");

Integer i4 = 127;

Integer i5 = 127;

Integer i6 = 128;

Integer i7 = 128;

System.out.println(i4 == i5);//true

System.out.println(i6 == i7);//false

System.out.println("**************************************");

Integer i8 = new Integer(127);

Integer i9 = new Integer(127);

System.out.println(i8 == i9);//false

System.out.println(i8.equals(i9));//true

System.out.println(i4 == i8);//false

}

/* Output:

true

true

**************************************

true

false

**************************************

false

true

false

*/

解析:第5和第6行的结果都为true。因为Integer和int比较时,Integer会自动拆箱(jdk1.5以上)。

第12行结果为true,第13行结果为false。因为Java在编译的时候,Integer i4=127被编译成-->Integer i4 = Integer.valueOf(127);

查看JDK源码:

public static Integer valueOf(int i){

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

得知,对于-128到127之间的数,会进行缓存,Integer i6 = 127时,会将127进行缓存,下次再写Integer i7 = 127时,就会直接从缓存中取,就不会新new对象了。

i8、i9使用的是new,对象不一样,所以第17行结果为false,第18行结果为true,第19行为false。

总结:

1、Integer是int的包装类,int的初始值为0,Integer的初始值为null;

2、无论如何,Integer和new Integer()不会相等。不会经历拆箱过程,i8的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,使用== 比较都为false。

3、两个非new出来的Integer,使用==比较,如果在-128到127之间,则是true,否则为false;

4、两个都是new出来的Integer,==比较都为false。若要比较值是否相等,需使用equals()方法进行比较;

5、int和Integer(无论是否是new出来的)比较,都为true,因为Integer会自动拆箱为int再去比较;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值