看这样两段代码,思考结果返回的是什么
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1 == num2);
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num3 == num4);
揭晓答案:第一段代码的结果是true,第二段代码的结果是false。不信可以自己去试试~~
这个时候,大家就疑惑了,明明都是一样的数,怎么一个判断结果就是true,一个 判断结果就是false,这就是面试常常踩坑的问题:128陷阱!!
128陷阱:
Integer 数据类型使用“==”比较时,如果对象值的范围在 127以上 或 -128以下,那么两个对象值相同的情况下,返回的结果是false。
为什么会出现这样的现象呢? 让我们一起看看 Integer 数据类型的 valueOf 方法的源码:
原因就是:Integer 的 valueOf 方法当中,存储着一个 cache 数组,该数组相当于一个缓存,范围在 -128~127 闭区间。
初始化 cache 数组源码:
当在该范围中进行自动装箱的时候,直接返回该值的内存地址(即 cache 数组的地址),所以在 -128~127 之间的数值用 == 进行比较时结果是相等(true),相当于比较的是同一元素的内存地址。不在该范围的数,需要开辟一个新的内存空间,此时内存地址就不相同了,所以返回结果是不相等(false)。
注意!!!!!!!!
如果对象是 new 出来的(如下),那么就不会存在128陷阱。
原因是 new 出来的对象,内存地址都是不同的,比较的就不是同一个对象了。
Integer num5 = new Integer(100);
Integer num6 = new Integer(00);
System.out.println(num5 == num6);
// 结果是 false
Integer num7 = new Integer(128);
Integer num8 = new Integer(128);
System.out.println(num7 == num8);
// 结果是 false
其实,不只是 Integer 类,其他包装类也有类似的缓存技术,还需要去了解一下包装类,自动装箱拆箱的知识内容。