首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >128陷阱详解

128陷阱详解

作者头像
人不走空
发布于 2024-07-13 00:29:40
发布于 2024-07-13 00:29:40
10900
代码可运行
举报
文章被收录于专栏:学习与分享学习与分享
运行总次数:0
代码可运行

Java 编程中,128陷阱(128 Trap) 是一个与 == 操作符和 equals() 方法有关的常见问题,特别是当我们比较 Integer 对象时。这个陷阱涉及到 Java 的自动装箱(autoboxing)和整数缓存机制(Integer Cache)。

背景

Java 中的整数缓存机制用于提高性能和减少内存使用。对于值在 -128 到 127 范围内的 Integer 对象,Java 会使用缓存池中的实例。这意味着相同值的 Integer 对象在该范围内将引用相同的实例。这个机制在自动装箱和拆箱时也会发挥作用。

128陷阱的详细解释

整数缓存机制: Java 对于值在 -128 到 127 之间的 Integer 对象会自动缓存。这意味着如果你使用自动装箱创建了一个 Integer 对象,并且该值在 -128 到 127 之间,Java 会使用相同的实例。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true

在上面的例子中,ab 指向的是同一个缓存的 Integer 实例。因此,== 操作符返回 true

超出缓存范围的对象: 对于超出 -128 到 127 范围的值,Integer 对象不会被缓存,每次都会创建新的对象。因此,即使两个 Integer 对象的值相同,它们也不会是同一个实例。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Integer x = 128;
Integer y = 128;
System.out.println(x == y); // false

这里,xy 是两个不同的 Integer 实例,即使它们的值相同,== 操作符也会返回 false

equals() 方法的作用equals() 方法在 Integer 类中被重写用于比较两个对象的值是否相等,而不是它们是否是同一个实例。因此,即使两个 Integer 对象不是同一个实例,只要它们的值相等,equals() 方法就会返回 true。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Integer x = 128;
Integer y = 128;
System.out.println(x.equals(y)); // true
常见问题示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class IntegerCacheExample {
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        Integer c = 200;
        Integer d = 200;

        // Comparisons using ==
        System.out.println(a == b); // true, because 100 is within the cache range
        System.out.println(c == d); // false, because 200 is outside the cache range

        // Comparisons using equals()
        System.out.println(a.equals(b)); // true
        System.out.println(c.equals(d)); // true
    }
}
如何避免 128陷阱
  1. 理解 ==equals() 的区别
    • 使用 == 仅用于比较基本类型和检查对象引用是否相同。
    • 使用 equals() 方法来比较对象的值是否相等。
  2. 明确使用 equals() 方法: 当你需要比较两个 Integer 对象的值时,始终使用 equals() 方法,而不是 ==
  3. 警惕自动装箱: 了解自动装箱和拆箱的行为及其在代码中的作用,尤其是当处理大范围的整数时。
总结

128陷阱是 Java 开发中容易遇到的一个问题,尤其在处理 Integer 对象的比较时。理解整数缓存机制和正确使用 equals() 方法是避免这个陷阱的关键。

参考资料
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试真题:Integer(128)引发的思考
Hey小伙伴们,今天要给大家安利一篇操作实践的文章,相信大家通过仔细阅读,一定会有所收货!
不惑
2024/11/26
4300
面试真题:Integer(128)引发的思考
Java基础:128陷阱之Integer缓存源码研究
在Java 5中,对于Integer的操作引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。
鲲志说
2025/04/07
790
Java基础:128陷阱之Integer缓存源码研究
Java包装类(Integer 详解 )
Java包装类 基本概述 --- 在某些场合要求所有的数据内容都必须是类类型的对象,而Java语言中有8种基本数据类型声明的变量都不是对象,为了使得这些数据在该场合种能够使用,则需要好进行对象化处理,此时就需要借助包装类将变量包装成对象再进行使用 包装类是为了值类型数据和对象间能互相转换、提供装箱和拆箱机制的类 基本数据类型 | 包装类型 | - | byte | Byte Boolean | Boolean short | Short char | Character int | Integer long
ruochen
2021/05/15
4880
Java包装类(Integer 详解 )
Java语法糖(一)
  语法糖(Syntactic Sugar):主要作用是提高编码效率,减少编码出错的机会。
在周末
2019/09/11
6810
Leader:这样的 Bug 你也写的出来???
Hello~各位读者新年好!不知道大家春节假期是否已延长,小黑哥刚接到通知,假期延长到 2 月 2 号,另外回去之后需要在家办公,自行隔离两周。还没试过在家办公,小黑哥就怕到时候生物钟还没调整过来,一觉睡醒已经是下午了。。。
andyxh
2020/02/14
4480
Leader:这样的 Bug 你也写的出来???
由自动装箱,引发的关于Integer的有趣现象
看完这篇文章,相信你一定可以很好的理解包装器类以及有些包装器类的自带缓存机制,也可以反手就给面试官说出为什么,下面代码的输出值为true:
东边的大西瓜
2022/05/05
3100
由自动装箱,引发的关于Integer的有趣现象
JAVA面试50讲之4:int和Integer的区别
对于第4条的原因: java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100);,而java API中对Integer类型的valueOf的定义如下:
用户1205080
2019/01/02
1K0
【面试题精讲】Java包装类缓存机制
Java 中的包装类(Wrapper Class)是为了将基本数据类型转换为对象而存在的。在 Java 中,每个基本数据类型都有对应的包装类,如 Integer、Double 等。
程序员朱永胜
2023/09/28
8470
夯实Java基础系列8:深入理解Java内部类及其实现原理
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/09/28
3.6K0
Java 中整型的缓存机制
本文将介绍Java中Integer的缓存相关知识。这是在Java 5中引入的一个有助于节省内存、提高性能的功能。首先看一个使用Integer的示例代码,从中学习其缓存行为。接着我们将为什么这么实现以及他到底是如何实现的。你能猜出下面的Java程序的输出结果吗。如果你的结果和真正结果不一样,那么你就要好好看看本文了。
前端教程
2018/07/27
9770
为什么Java中1==1为真,而128==128为假?基于享元模式的整数缓存原理分析
今天我们来谈谈在Java中可能会让你感到惊讶的事情——为什么有时用==比较数字的行为并不像你期望的那样。
公众号:码到三十五
2024/10/19
1700
JAVA自动拆装箱、equals与==比较
自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。
chenchenchen
2023/01/30
4660
Java 中为什么设计了包装类
在 Java 中,万物皆对象,所有的操作都要求用对象的形式进行描述。但是 Java 中除了对象(引用类型)还有八大基本类型,它们不是对象。那么,为了把基本类型转换成对象,最简单的做法就是「将基本类型作为一个类的属性保存起来」,也就是把基本数据类型包装一下,这也就是包装类的由来。
飞天小牛肉
2021/03/18
1.4K0
Java 中为什么设计了包装类
Java5新特性及使用
Java语言引入泛型的好处是安全简单。可以将运行时错误提前到编译时错误。在Java5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的任意化,任意化带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
Abalone
2022/07/14
1.5K0
JavaSE的自动装箱和自动拆箱
内心怀揣自己的真是答案,我们看看下边的源代码: 先看看Integer装箱和拆箱的函数源码:
静默加载
2020/05/31
4800
Java的装箱和拆箱,你掌握到了第几层?
自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。
Bug开发工程师
2018/07/23
4650
Java的装箱和拆箱,你掌握到了第几层?
理解Java Integer的缓存策略
本文将介绍 Java 中 Integer 缓存的相关知识。这是 Java 5 中引入的一个有助于节省内存、提高性能的特性。首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为。接着我们将学习这种实现的原因和目的。你可以先猜猜下面 Java 程序的输出结果。很明显,这里有一些小陷阱,这也是我们写这篇文章的原因。
哲洛不闹
2018/09/18
8340
理解Java Integer的缓存策略
Java基础系列1:深入理解Java数据类型
当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型。
王金龙
2020/02/17
5770
面试官:new Integer(“127“)和Integer.valueOf(“128“)有什么区别
在 Java 面试中,经常会遇到关于 Integer 对象创建和缓存机制的问题。例如,new Integer("127") 和 Integer.valueOf("128") 的区别。这个问题触及了 Java 中整数缓存机制的一个微妙之处。
用户11397231
2025/06/02
940
面试官:new Integer(“127“)和Integer.valueOf(“128“)有什么区别
必考:从字节码层面看自动拆装箱的原理
上一篇文章中,我们分享包装类的缓存机制时,提到了自动装箱的问题。今天我们就重点分享自动装箱的原理,及其相关的知识点(笔试必考)!
程序视点
2023/11/16
1790
必考:从字节码层面看自动拆装箱的原理
相关推荐
面试真题:Integer(128)引发的思考
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档