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

128陷阱详解

作者头像
人不走空
发布于 2024-07-13 00:29:40
发布于 2024-07-13 00:29:40
12000
代码可运行
举报
文章被收录于专栏:学习与分享学习与分享
运行总次数: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
4480
面试真题:Integer(128)引发的思考
Java Integer包装类缓存机制详解
在解决力扣第76题「最小覆盖子串」时,我使用了Map<Character, Integer>来记录字符串中各字符的出现次数。在比较两个字符串各自字符出现次数时,最初我使用了"=="操作符进行比较,但无法通过所有测试用例。后来改用equals()方法进行比较,最终成功通过了。
Eulogy
2025/07/14
820
为什么Java中1==1为真,而128==128为假?基于享元模式的整数缓存原理分析
今天我们来谈谈在Java中可能会让你感到惊讶的事情——为什么有时用==比较数字的行为并不像你期望的那样。
公众号:码到三十五
2024/10/19
1830
Java基础:128陷阱之Integer缓存源码研究
在Java 5中,对于Integer的操作引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。
鲲志说
2025/04/07
910
Java基础:128陷阱之Integer缓存源码研究
Integer用==判断有什么问题
Java 对 Integer 对象在 -128 到 127 范围内进行了缓存优化,自动装箱(如 Integer a = 100)会复用缓存对象,此时 == 可能返回 true;但超出此范围时,每次自动装箱会创建新对象,导致 == 失效 。
麦辣鸡腿堡
2025/03/18
2580
一篇文章讲清楚Java基本数据类型,常量池,以及自动拆装箱的秘密
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
Java技术江湖
2019/09/24
6.3K0
一篇文章讲清楚Java基本数据类型,常量池,以及自动拆装箱的秘密
Java中的自动拆装箱、装箱缓存
Java 是一种面向对象的编程语言,Java 中的类把方法与数据类型连接在一起,构成了自包含式的处理单元。但在 Java 中不能定义基本类型对象,为了能将基本类型视为对象处理,并能连接相关方法,Java 为每个基本数据类型都提供了包装类,如 int 型数值的包装类 Integer,boolean 型数值的包装类 Boolean 等。这样便可以把这些基本类型转换为对象来处理了。
用户7886150
2020/12/10
6190
Java基础系列1:深入理解Java数据类型
当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型。
王金龙
2020/02/17
5880
夯实Java基础系列2:Java基本数据类型,以及自动拆装箱里隐藏的秘密
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
程序员黄小斜
2019/09/25
3.5K0
JAVA自动拆装箱、equals与==比较
自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。
chenchenchen
2023/01/30
4780
夯实Java基础系列8:深入理解Java内部类及其实现原理
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/09/28
3.6K0
Java语法糖(一)
  语法糖(Syntactic Sugar):主要作用是提高编码效率,减少编码出错的机会。
在周末
2019/09/11
6930
Leader:这样的 Bug 你也写的出来???
Hello~各位读者新年好!不知道大家春节假期是否已延长,小黑哥刚接到通知,假期延长到 2 月 2 号,另外回去之后需要在家办公,自行隔离两周。还没试过在家办公,小黑哥就怕到时候生物钟还没调整过来,一觉睡醒已经是下午了。。。
andyxh
2020/02/14
4530
Leader:这样的 Bug 你也写的出来???
奇怪的Java题:为什么128 == 128返回为false,而127 == 127会返回为true?
奇怪的Java题:为什么128 == 128返回为false,而127 == 127会返回为true? 在回答这个问题之前,我们先来看看int和Integer的对比,一步步揭开问题的答案。 1. i
互扯程序
2019/06/19
2.8K0
Java 中整型的缓存机制
本文将介绍Java中Integer的缓存相关知识。这是在Java 5中引入的一个有助于节省内存、提高性能的功能。首先看一个使用Integer的示例代码,从中学习其缓存行为。接着我们将为什么这么实现以及他到底是如何实现的。你能猜出下面的Java程序的输出结果吗。如果你的结果和真正结果不一样,那么你就要好好看看本文了。
前端教程
2018/07/27
9900
Java中的自动装箱与拆箱
自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。
lyb-geek
2018/08/06
6540
Java5新特性及使用
Java语言引入泛型的好处是安全简单。可以将运行时错误提前到编译时错误。在Java5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的任意化,任意化带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
Abalone
2022/07/14
1.5K0
理解Java Integer的缓存策略
本文将介绍 Java 中 Integer 缓存的相关知识。这是 Java 5 中引入的一个有助于节省内存、提高性能的特性。首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为。接着我们将学习这种实现的原因和目的。你可以先猜猜下面 Java 程序的输出结果。很明显,这里有一些小陷阱,这也是我们写这篇文章的原因。
哲洛不闹
2018/09/18
8420
理解Java Integer的缓存策略
面试官:new Integer(“127“)和Integer.valueOf(“128“)有什么区别
在 Java 面试中,经常会遇到关于 Integer 对象创建和缓存机制的问题。例如,new Integer("127") 和 Integer.valueOf("128") 的区别。这个问题触及了 Java 中整数缓存机制的一个微妙之处。
用户11397231
2025/06/02
1100
面试官:new Integer(“127“)和Integer.valueOf(“128“)有什么区别
【Java 】包装类详解:从基本概念到实战技巧
🔥 在 JAVA 中,八大基础数据类型(int,float,double...)不是继承自 Object,并且不具备对象的特征的。比如:基本数据类型就不能调用方法。
IsLand1314
2024/10/15
2630
【Java 】包装类详解:从基本概念到实战技巧
推荐阅读
相关推荐
面试真题:Integer(128)引发的思考
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档