转载

自动装箱?拆箱?==问题?详解java面试常见的一个问题

相信大家都在面试中都被问到过一个问题,这个问题也是近年来面试官刁难人比较常见的一个问题,所以也被大家所熟知了,本质上也很简单,但是也是非常基础的一个题目。

Integer a = 100;
Integer b = 100;
System.out.println(a == b);
Integer a = 180;
Integer b = 180;
System.out.println(a == b);
复制代码

题目也就是让你回答一下上面的输出情况,显而易见第一个是true,第二个是false,这个大家应该都知道了

2:自动装箱和拆箱

我们都知道!java的核心思想是:万物皆对象,但是,实际上为了平时写代码的便利性,还是保留了8个基础数据类型:byte, short, char, int, long, float, double 和 boolean

那么问题来了:下面这种情况怎么操作

//a是Integer对象类型,100是基础int类型
Integer a = 100;
复制代码

这个时候我们聪明的编译器就会调用valueOf去做装箱为对象

自动装箱?拆箱?==问题?详解java面试常见的一个问题

自动拆箱就正好反过来使用对象的intValue()方法区拆箱为基础数据类型

自动装箱?拆箱?==问题?详解java面试常见的一个问题

3:解答上面的 == 不一样的问题

那么我们在温故一下上面那个问题好了,额外我再加一个干扰项

Integer a = 100;
Integer b = 100;
System.out.println(a == b);  // -> true

Integer a = 180;
Integer b = 180;
System.out.println(a == b); // -> false

Integer a = new Integer(100);
Integer b = new Integer(100);
System.out.println(a == b); // -> false
复制代码

所以我们要先理解==的意思,基础类型==是比较值是否相等,对象类型是比较内存地址是否相同

那么我们结合Integer.valueOf()代码就可以知道,我们在装箱的时候会进行一次缓存判断,在[-128,127]范围内的时候,会取一个缓存对象,所以 a和b对象是同一个当然是true,第二个180超出范围了,就会new一个新的Integer对象,内存地址肯定不一样

那么最后一题,new Integer(100)实际上是直接自己new了对象,没有用到装箱,不过我想一般也没人这么用吧···

4:总结

其实java中很多设计的小细节,小问题都包含了设计者们的智慧和心血,我们在看这些面试小问题的时候,应该仔细琢磨琢磨为什么这么设计,然后自己在实际的工作中也可以去运用这些巧妙的设计和知识!!

原文  https://juejin.im/post/5dedc0d5e51d4558476c4e4a
正文到此结束
Loading...