Java基本类型的装箱与拆箱

Java基本类型的装箱与拆箱

今天,我抽空做了一道选择题,是关于这方面,结果一不小心就错了。。。
题目是这样的:

在jdk1.5的环境下,有如下4条语句:

Integer i01 = 59;
int i02 = 59;
Integer i03 =Integer.valueOf(59);
Integer i04 = new Integer(59)

以下输出结果为false的是:

A. System.out.println(i01== i02);
B. System.out.println(i01== i03);
C. System.out.println(i03== i04);
D. System.out.println(i02== i04);

首先,这道题的答案是C。

A选项,虽然i01是int的打包器类型,i02是普通的int类型,但是当二者进行比较时,i01会自动拆箱,也就是i01会把里面的数值(59)拿出来进行比较,因此当然是true。

B选项,我们看到,i03是通过valueOf方法返回得到的,那么valueOf是怎么运作的呢,看一下这个方法的源码。

public static Integer valueOf(int i) {
     if (i >= IntegerCache.low&& i <= IntegerCache.high)
     return IntegerCache.cache[i+ (-IntegerCache.low)];
     return new Integer(i); 
}

这段代码简单来说,就是如果传入的int在IntegerCache.low(默认值是-128)与IntegerCache.high(默认值是127)之间,那就尝试看看前面缓存中有没有打包过相同的值,如果有就直接返回,否则就使用new创建新的Integer实例。对于i03来说,因为之前缓存中没有59,因此会返回新的Integer实例。会自动装箱,也就是还会调用valueOf方法,这时因为之前缓存区中存在59,所以会返回与i01相同的引用,因此是true。

C选项,我觉得主要通过分析B选项,这个选项很容易看出来是false了,因为i04就是直接通过new生成的,因此指向i04堆空间的引用和指向i03堆空间的一定不一样。

D选项,因为i02是基本数据类型,即使i04是打包器类型,但在这两者之间比较的时候,打包器类型会自动拆箱(把里面的数值(59)拿出来),因此是true。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值