Java面试题 - “Integer”类

Java面试题---“Integer包装类”

例题

//代码段1
Integer num1=100;
Integer num2=100;
System.out.println(num1==num2);

//代码段2
Integer num3=200;
Integer num4=200;
System.out.println(num3==num4);

//代码段3
Integer num5 = new Integer(100);
Integer num6 = new Integer(100);
System.out.println(num5==num6);

运行结果:
true
false
false

我们不仅要知其然,还要知其所以然

分析

首先分析“代码段1”和“代码段2”
这里用到的是java自动拆装箱完成的引用赋值,然而我们并不知道自动拆装箱的底层到底干了什么。
那么要怎么知道它底层到底干了啥呢?
我们在num1的赋值这行代码打上断点,然后Debug运行,接着按下Force Step Into来深入了解。

请添加图片描述
这时候会发现,进入了底层调用的代码片段:
在这里插入图片描述

这段代码说明,自动拆装箱底层其实就是调用了Integer类的静态方法valueOf来创建对象的。然后按住Ctrl后单击IntegerCache.low,就会进入Integer类的静态内部类IntegerCache的静态代码块部分(由于代码较长,就不在这里展示了)。通过阅读这部分的代码块可以得出以下信息:

valueOf方法代码块中的三个常量分别是:

  • IntegerCache.low:一个int常量,值为127
  • IntegerCache.high:一个int常量,值为-128
  • IntegerCache.cache:一个Integer类型数组,而这个数组在类加载的时候就已经被创建了,并把-128到127对应的Integer对象存入了cache数组中。

结论

通过以上分析可以得出结论:

  • 如果参数值为-128至127这个范围之间的数字,会返回cache数组中的对应元素引用。(所以代码块一的结果为true)
  • 如果不在此范围内,则会new一个新对象,并返回其引用。(所以代码块2的结果为false)

至此,例题中“代码段1”和“代码段2”的答案为ture和false便可推出。


最后分析“代码段3”
大家都知道new对象,会在堆内存中开辟一段新的空间,所用双等号“==”比较两次new出来的对象,结果为false。代码块3的结果由此得出。


扩展

最后再给大家扩展一下Integer对象的数学运算相关问题

Integer num1=90;
Integer num2=100;
Integer num3=200;
num1+=10;
System.out.println(num1==num2);
System.out.println(num3==num1+num2);

运行结果:
true
true

分析
(1)执行num1+=10,底层调用的依旧是Integer类的valueOf方法,所以当num1+=10执行完毕,num1指向Integer类的cache数组中100所对应的Integer对象。
(2)num1== num2,这里进行的是引用比较。因为都是指向cache数组中100对应的Integer对象,所以结果为true
(3)num3== num1+num2,这里进行的是数值比较。因为运算符+是不适用于对象之间的计算的,所以这里会自动拆箱为int数值,也就是等于num3==200。此时左边的num3也会被自动拆箱为int数值来与等号右边的数值相比较。所以结果为true


小结

java中所有的包装类都可以自动拆装箱,但是像Integer这样设置并初始化底层数组的包装类只有:

Integer (-128至127)
Short (-128至127)
Byte (-128至127)
Character (0至127)


那么为什么Float和Double不会设置底层数组呢?
很显然,小数是枚举不完的。


//注意:Float和Long类型直接赋值时记得加上后缀‘f’和‘l’哦!


以上就是一个关于Integer类的面试题,以及一个扩展研究的问题,你get到了嘛
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值