题目如图所示:
很多人可能会觉得两个输出都会是false,因为我们都会觉得"=="比较的是引用类型的地址,虽然放入的值都一样但是重新创造了新对象,地址不一样,所以结果都是false.
然而,当我们运行程序会发现结果都是false.
下面,我们来分析为什么是这样的结果.
我们知道,像这样的操作属于自动装箱.实际上,底层会自动调用valueOf()方法帮助基本数据类型转化为包装类型.
底层其实在为我们进行显示装箱,如:integer i = interger.valueOf(a);
我们可以打开这个文件的字节码文件查看这一操作:
我们继续查看valueOf()方法的底层源代码:
查看说明部分我们可以知道,这个方法将总是缓存-127 到128之间的值.如果传入的值在这个区间,返回cache[i + (-IntegerCache.low)]的值.如果传入的值不在这个区间将一直new 一个新对象.如图所示: