Integer 和 int类型的自动拆箱和装箱简介

4 篇文章 0 订阅

废话不说,先贴代码大家自测一下:

Integer a = new Integer(3);
Integer b = 3;
int c = 3;
System.out.println(a == b);
System.out.println(a == c);

Integer f1 = 100, f2 = 100;
Integer f3 = 200;
Integer f4 = 200;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
System.out.println(f3 == (f1 + f2));

我们先看第一题:

a==b的答案是:false

原因很简点,因为对与对象来说 “==” 判断的依据是两个对象的地址是否相等,显然a是新建的对象和b自动包装出来的对象m指向的不是同一个地址,所以为false。

 

a==c的答案是:true

因为c是一个基本类型的数据,包装类Integer和基本类型的数据在比对时,会先自进行动拆箱(调用Integer的intValue()方法),然后再进行比较,即使用a对象的数值和基本类型c进行数值大小的比较。

 

f1==f2的答案是:true

因为Integer是有一个缓存机制的,我们发现大部分数据操作都是集中在有限的、较小的数值范围,因而,在 Java 5 中新增了静态工厂方法 valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。按照 Javadoc解释,这个值默认缓存是 -128 到 127 之间,所以在自动包装对象调用valueOf方法时,数值在-128-127之间会直接返回缓存池中的对象。f1,f2都是小于127大于-128的数值,所以引用的对象地址也是一样的。

 

f3==f4的答案:false

同样是因为上面的原因,f3和f4都是新建的Integer对象,所以对象地址不同,答案是false。

 

f3==(f1+f2)的答案:true

因为Integer对象之间在执行符号运算时,会自动拆箱,所以f1+f2是其对象数值的相加,得到的结果是int类型的200,此时再次和f3进行比较,因为200是int类型的基本类型数据,所以f3也会进行自动拆箱,和之前运算得到的200进行比较,值相等,结果为true。

 

下面附上编译后的字节码文件(已经进行过反编译):

Integer a = new Integer(3);
Integer b = Integer.valueOf(3);
int c = 3;

System.out.println(a == b);
System.out.println(a.intValue() == c);

Integer f1 = Integer.valueOf(100);
Integer f2 = Integer.valueOf(100);
Integer f3 = Integer.valueOf(200);
Integer f4 = Integer.valueOf(200);

System.out.println(f1 == f2);
System.out.println(f3 == f4);
System.out.println(f3.intValue() == f1.intValue() + f2.intValue());

查看编码后的文件,会清晰很多。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值