面试官常问问题:Java中的128陷阱详解

发布时间:2024年01月15日

看这样两段代码,思考结果返回的是什么

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? 类,其他包装类也有类似的缓存技术,还需要去了解一下包装类,自动装箱拆箱的知识内容。

文章来源:https://blog.csdn.net/Yangyeon_/article/details/135611919
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。