大家好,我是小威哥,欢迎来到我的经典面试题解析,我会在这个系列中还原我在面试中遇到的一些有趣的很值得回味的问题,并且进行解析,如果有错误和建议请联系我!
面试问题如下:
给定如上的代码,输出结果是怎么样的 -> 答案是 第一个为true,第二个是false
那么问题来了: 为什么会这样呢,大家都知道==是指引用相等,可是int1和int2明明是两个对象为什么是等于呢,既然第一个输出是true,到了第二个输出却是false呢。那就让我们揭开答案
题目解析:
大家都知道java里面基本类型和对象类型的自动拆箱装箱机制,其实在 Integer int1 = 127; 的时候触发自动装箱,这时候会调用 Integer.valueof()进行装箱为 Integer.我们来看下这个方法:
这里的low是-128,high是127,所以在这个范围内,我们不会去new一个新的对象,会从IntegerCache中拿一个对应的Integer对象(IntegerCache会预先生成-128到127的每个Integer实例). 所以上面的int1 和 int2 其实是同一个实例,int3和int4就不是同一个实例了.这里引申出来的一个问题就是会问这几个实例的堆栈内存指向.
由此大家可以看到:这个小小的问题也有大大的基础学问,以后我们在开发当中如果是Integer和Long这样的实例对比,千万不要直接==哦,至少两边要有一个基本类型才会自动拆箱去对比基本类型.
网友评论