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

文章讨论了Java中Integer类型在使用==比较时的特殊行为——128陷阱,解释了当数值在-128到127范围内,由于valueOf方法的缓存机制导致地址相同,比较为真;超出这个范围则新分配内存,地址不同,比较为假。还提到了newInteger时的情况,以及包装类中的类似现象。
摘要由CSDN通过智能技术生成

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

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

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值