- 在JDK1.5之后,下列java程序输出结果为:
int i = 0;
Integer j = new Integer(0);
System.out.println(i == j);
System.out.println(j.equals(i));
本题的考点在于对包装型数据类型自动拆装箱的考察。
- 基本数据类型和包装型进行
==
运算符的比较时,包装型会自动拆箱变为基本数据类型后再进行比较。因此在该题中,在进行i == j
的比较时,j
会从Integer(0)
自动拆箱变为int
型再跟i
进行比较,两个基本数据类型在进行==
比较时,会比较数值大小,所以i==j
的结果为true。 - 包装型调用
equals()
,如果参数是基本数据类型,这时候基本数据类型会进行自动装箱,首先比较类型,再比较大小,所以j.equals(i)
的结果为false。
- 有如下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);
A选项:
Integer i01 = 59
这里涉及到自动装箱过程,把59从基本数据类型转换成包装类型,使其产生一个引用并存在栈中指向这个整型常量所占的内存,这时i01就是Integer(59)的引用。int i02 = 59
由于int是基本数据类型,所以不存在引用问题,直接由编译器将其存放在栈中,换一句话说,i02本身就是int(59)。
那么System.out.println(i01 == i02)
结果任何呢?这里涉及到了拆箱的过程,因为等号一边存在基本类型所以编译器后会把另一边的Integer
对象拆箱成int
型,这时等号两边比较的就是数值大小,所以是true。
B选项:
Integer i0 = 59
返回的是指向整型常量的引用。i03 = Integer.valueOf(59)
这个函数的功能就是把int
型转换成Integer
,可以理解为自动装包过程,又因为数值在[-127~128]之间,所以是利用缓存中的i01创建的59对象,而不创建新对象。
所以System.out.println(i01 == i03)
结果也是true。
C选项:
i03 = Integer.valueOf(59)
返回的是已缓存的对象的引用。- 而
Integer i04 = new Integer(59)
是在堆中新开辟的空间,只要有new关键字,就一定在堆上开辟新空间。
二者都是Integer
类型,==
比较地址,所以System.out.println(i03 == i04)
返回的值为false。
D选项:
System.out.println(i02 == i04)
,i02是整型变量,i04是引用,这里又用到了自动拆箱包,虚拟机会把i04指向的数据拆箱为整型变量再与之比较,所以比较的是基本数据类型的值,返回true。