[牛客网] int与Integer

  • 在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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值