概述
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。
最后
以上就是繁荣抽屉为你收集整理的Java基本类型的装箱与拆箱Java基本类型的装箱与拆箱的全部内容,希望文章能够帮你解决Java基本类型的装箱与拆箱Java基本类型的装箱与拆箱所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复