相信大家都在面试中都被问到过一个问题,这个问题也是近年来面试官刁难人比较常见的一个问题,所以也被大家所熟知了,本质上也很简单,但是也是非常基础的一个题目。
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去做装箱为对象
自动拆箱就正好反过来使用对象的intValue()方法区拆箱为基础数据类型
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