Java装箱的 " == " 的问题

本文探讨了Java中Integer对象的装箱、拆箱过程及缓存池的使用。通过实例代码展示了在缓存范围内(-128至127),直接数字装箱和valueOf方法会复用同一资源,而超出此范围则创建新对象。文章还提供了基本类型的缓冲池范围。

装箱和拆箱

 packagecom.xzj.Test;
 ​
 /*
 * @ author thisxzj
 * @ create 2019-02-25 10:56
 */
 publicclassBase{
 publicstaticvoidmain(String[] args) {
 finalintNUM=127;
 Integeri1=NUM;
 Integeri2=Integer.valueOf(NUM);
 Integeri3=newInteger(NUM);
 ​
 System.out.println("i1 ==? i2 "+(i1==i2));
 System.out.println("i1 ==? i3 "+(i1==i3));
 System.out.println("i2 ==? i3 "+(i2==i3));
 ​
 System.out.println("i1 equals ? i2 "+(i1.equals(i2)));
 System.out.println("i1 equals ? i3 "+(i1.equals(i3)));
 System.out.println("i2 equals ? i3 "+(i2.equals(i3)));
 }
 }
 ​

结果:

 i1 ==? i2 true
 i1 ==? i3 false
 i2 ==? i3 false
 i1 equals ? i2 true
 i1 equals ? i3 true
 i2 equals ? i3 true

Integer 缓存池的大小默认为 -128~127。在int的数字在缓存的范围内的时候,可以认为直接数字装箱和valueOf是等价的。他们使用的是用一份资源。

在超过了缓存池的范围的时候:将上面代码中NUM常量变为128

运行的结果:

 i1 ==? i2 false
 i1 ==? i3 false
 i2 ==? i3 false
 i1 equals ? i2 true
 i1 equals ? i3 true
 i2 equals ? i3 true

可以看到,超过了这个范围,Integer对象使用的均不是同一份资源。

以上是Integer为例子,探索了包装类的缓存范围。

基本类型对应的缓冲池如下:

  • boolean: true 、false

  • byte:-128 ~ 127

  • short: -128 ~ 127

  • int: -128 ~ 127

  • char:0 ~ 127 对应的char

转载于:https://www.cnblogs.com/zjxu97/p/10429974.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值