涨姿势:为什么 Java 中 “1000==1000” 为 false,而 ”100==100“ 为 true?

孤舟笔记 基础篇二 两个 Integer 用 == 比较结果竟然不一样?真相藏在 JVM 里 Java中Integer的==比较行为差异源于缓存机制:默认缓存-128到127的Integer对象,范围内valueOf()返回同一对象,==比较为true;范围外创建新对象,==比较为false。正确比较应使用equals()方法而非==。可通过JVM参数调整缓存上限,但下限固定为-128。其他包装类如Long、Short也有类似缓存,而Float/Double则没有。实际编码中,包装类比较必须使用equals()以避免意外结果,这是Java基础面试的经典考点。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

为什么 Java 中“1000==1000”为false,而”100==100“为true? 这是一个挺有意思的讨论话题。

如果你运行下面的代码:

    Integer a = 1000, b = 1000;
    System.out.println(a == b);//1
    Integer c = 100, d = 100;
    System.out.println(c == d);//2

你会得到

false
true

基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。

因此,后面一条语句也应该是false 。

这就是它有趣的地方了。如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。

所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——

Integer c = 100;

的时候,它实际上在内部做的是:

Integer i = Integer.valueOf(100);

现在,如果我们去看valueOf()方法,我们可以看到

public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i
          return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
    }

如果值的范围在-128到127之间,它就从高速缓存返回实例。

所以…

Integer c = 100, d = 100;

指向了同一个对象。

这就是为什么我们写

System.out.println(c == d);

我们可以得到true。

现在你可能会问,为什么这里需要缓存?

合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。

然而,通过反射API你会误用此功能。

运行下面的代码,享受它的魅力吧

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

      Class cache = Integer.class.getDeclaredClasses()[0]; //1
      Field myCache = cache.getDeclaredField("cache"); //2
      myCache.setAccessible(true);//3

      Integer[] newCache = (Integer[]) myCache.get(cache); //4
      newCache[132] = newCache[133]; //5

      int a = 2;
      int b = a + a;
      System.out.printf("%d + %d = %d", a, a, b); //
    }

来源:码农网

译文链接:http://www.codeceo.com/article/why-java-1000-100.html

英文原文:https://dzone.com/articles/why-1000-1000-returns-false-but-100-100-returns-tr



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

兄弟,艿一口,点个赞!????

Ansible自动化部署100台服务器实战:从SSH配置到滚动更新 Ansible是一种基于SSH协议的无Agent、声明式IT自动化工具,其核心原理是通过YAML描述系统期望状态,由控制节点并发发起非交互式SSH连接,自动完成软件安装、服务配置、权限管理等操作。相比Shell脚本,它提供幂等性、错误隔离与状态追踪;相比SaltStack/Puppet,它免去Master/Minion架构,学习成本低、启动极快;结合Vault加密、动态Inventory和serial滚动策略,可支撑金融级合规部署与零停机发布。本文聚焦Oracle Linux环境下的真实大规模落地场景,涵盖 阅读详情

相关推荐

Java彩票模拟题:HashSet去重与随机数边界控制实战

HashSet是Java中基于哈希表实现的无序不重复集合,其去重机制依赖hashCode()与equals()协同判断,底层通过数组+链表(或红黑树)结构实现O(1)平均插入性能;随机数生成需精准控制区间边界,如nextInt(900)+100确保100~999三位数范围,避免nextInt(1000)引入非法值;这些基础能力直接支撑高并发场景下的数据唯一性保障与输入健壮性设计,在用户投注、订单号生成、缓存键去重等真实业务中广泛存在。本文以彩票号码生成为切入点,解析HashSet内存布局、Random边界陷

weixin_33957648的博客 604

为什么1000==1000返回false,100==100返回true?

这可能是个讨论得较多的话题,但是我觉得它很有趣:为什么1000==1000返回false,100==100返回true?public static void main(S...

zhupanlinch的博客 589

稀疏阵列选型指南:互质阵、嵌套阵、MRA,谁才是你项目里的‘性价比之王’?

本文深入探讨了稀疏阵列技术中的互质阵、嵌套阵和MRA三大架构的工程化选型策略,重点分析了它们在DOA估计、自由度、旁瓣抑制和计算复杂度等核心指标上的表现。通过实际案例和配置示例,为智能天线、声学定位和毫米波雷达等应用场景提供技术选型指南,帮助研发团队在硬件成本与性能之间找到最佳平衡点。

weixin_42525005的博客 489

为什么在Java中使用Integer,1000==1000是false,而100==100是true?

为什么在Java中使用Integer,1000==1000是false,而100==100是true?

未知的希望,是我不灭的信仰 907

Clion+platformIO开发ESP32时找不到lib文件中引入第三方库的头文件(头文件下有波浪线),实际编译是成功的解决方法

Clion+platformIO开发ESP引入第三方库文件编译器无法找到.h文件但编译成功

zs5218的博客 1852

手把手教你用QEMU虚拟化华为路由器固件(附完整网络配置指南)

本文提供了一份详尽的QEMU虚拟化华为路由器固件的实战指南。从固件解包、网络桥接配置到QEMU虚拟机启动,手把手教你搭建完整的嵌入式设备沙箱环境,特别适合安全研究、逆向分析和学习嵌入式系统工作原理。

tgb3456789的博客 943

新手常踩的坑,为啥 1000 == 1000 是 false?

128~127。其实默认调用了如果数字在-128~127之间,则直接从缓存中获取Integer对象。如果数字在-128~127之外,则该方法会new一个新的Integer对象。我们在判断两个对象是否相等时,一定要多注意:判断两个对象的引用是否相等,用==号判断。判断两个对象的值是否相等,调用equals方法判断。

骑着牛的奇兵的博客 1165

SAP LTMC实战指南:物料主数据高效导入全解析

本文详细解析了SAP LTMC工具在物料主数据高效导入中的实战应用,包括工具选择、项目搭建、模板定制、数据导入全流程及常见问题解决方案。重点介绍了LTMC的预置模板、LTMOM灵活配置、数据校验机制等核心功能,帮助用户快速掌握SAP数据迁移技巧,提升工作效率。

weixin_33738555的博客 436

java 100==100,为什么Java中100==100为true而1000==1000为false?详细分析解释

这可能是每一个初学Java的人都会遇到的很有意思的问题。执行下列代码:Integera=100;Integerb=100;Integerc=1000;Integerd=1000;System.out.println(a==b);System.out.println(c==d);你将会得到以下的结果:truefalse那么这是为什么呢?这里我们就不得不提一下“==”的作用了(...

weixin_31138555的博客 1019

SDFCOM_SWC警告深度剖析:从assign短路到时序标注失效的链路追踪

本文深入剖析了SDFCOM_SWC警告的根源,从assign短路到时序标注失效的全链路追踪。通过分析RTL设计中的assign语句陷阱、综合阶段的优化变形以及PrimeTime生成SDF文件的视角,提出了重构RTL设计、警告抑制和SDF生成优化等解决方案,帮助工程师有效避免时序标注问题。

weixin_42519985的博客 366

OpenHarmony RK3568 从 32 位切换到 64 位用户空间指南

修改了编译参数(如修复 Q5 后),但 ThinLTO 缓存中保留了旧参数编译的 bitcode。这是一种节省内存的设计(32 位指针占 4 字节 vs 64 位占 8 字节),但在某些场景下需要切换为纯 64 位。切换到 64 位用户空间后,CPU 全程运行在 AArch64 状态,不再需要 AArch32 兼容模式。内核本身已经是 64 位(aarch64),切换用户空间位数不影响内核。(32 位兼容层)在纯 64 位系统中不再需要,可以关闭以减小内核体积。这两个参数对 64 位编译毫无意义,配合。

程小二的博客 690

为啥 1000 == 1000 是 false

答:-128~127是使用最频繁的数字,如果不做缓存,会在内存中产生大量指向相同数据的对象,有点浪费内存空间。今天跟大家聊一个有趣的话题,在Java中两个Integer对象做比较时,会产生意想不到的结果。文章示例中的1000,超出了-128~127的范围,所以对象a和b的引用指向了两个不同的地址。在Java中,除了上面的这8种类型,其他的类型都是对象,保存的是引用,而非数据本身。而示例中的100,在-128~127的范围内,对象a和b的引用指向了同一个地址。上面例子中的a和b,是两个Integer对象。

liu7322的博客 509

逆向工具:一文讲述 Ghidra 的详细使用

Ghidra是由NSA开源的一款功能强大的逆向工程框架,支持多平台、多架构和多种文件格式分析。本文详细介绍了Ghidra的核心优势、安装配置方法、主界面功能模块,并通过一个CrackMe示例演示了完整的逆向分析流程。文章还讲解了高级功能如交叉引用、控制流图分析、数据类型重建和脚本自动化等,最后提供了常见文件格式的分析技巧。作为IDA Pro的免费替代方案,Ghidra适合个人学习、教学和中小项目使用。(149字)

数据知道的博客 4354

涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?

如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。现在,如果我们去看valueOf()方法,我们可以看到​​​​​​​。运行下面的代码,享受它的魅力吧​​​​​​​。然而,通过反射API你会误用此功能。

IT界那些事儿 7786

Claude Code(8):使用 skill-creator 打造属于测试人员的 Skills

本文介绍了如何使用Claude Code的skill-creator工具快速创建测试相关的Skills。skill-creator是一个专门用于创建新Skills的Skill,相比手动创建更高效。文章详细演示了安装skill-creator的步骤,并通过创建"测试计划编写助手"的实战案例,展示了如何通过对话方式定义Skill名称、触发条件和功能需求。skill-creator会自动生成完整的SKILL.md文件和目录结构,用户只需确认即可完成Skill创建。

blues_C的博客 528

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?

为什么 Java 中“1000==1000”为false,而”100==100“为true?这是一个挺有意思的讨论话题。如果你运行下面的代码:Integer a = 1000, b = 1000; System.out.println(a == b);//1Integer c = 100, d = 100; System.out.println(c == d);//2你会得到fal...

weixin_40008920的博客 79

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?

问题:为什么1000 == 1000返回为False,而100 == 100会返回为True?这是我们今天要讨论的话题,因为我觉得它非常的有趣。如果你运行如下代码:Integer a = 1000, b = 1000; System.out.println(a == b);//1 Integer c = 100, d = 100; System.out.println(c == d);//2你会

Right_pro的博客 1736

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java一千_涨姿势:为什么Java中“1000=1000”为false,而”100=100“为true?

这是一个挺有意思的讨论话题。如果你运行下面的代码:你会得到基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。因此,后面一条语句也应该是false 。这就是它有趣的地方了。如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之...

weixin_42327291的博客 165

并发 01 · 开篇-并发为什么难

本文是Java并发编程系列的开篇,通过一个简单的多线程累加问题引出并发编程的核心挑战。文章指出并发难点的根源在于底层硬件机制(如CPU多核、缓存、编译器优化)导致的三大问题:原子性(如count++被拆分为多步操作)、可见性(线程修改的变量值对其他线程不可见)、有序性(代码执行顺序可能被重排)。通过分析进程与线程的区别、上下文切换的成本,解释了为何并发编程需要权衡性能与正确性。文章后续将围绕这些核心问题展开,系统讲解锁、volatile、线程状态管理等解决方案。全文以"理解机制而非记忆API"为导向,为后续

记录后端技术的深水区:MySQL、并发、JVM、分布式。原理为主,实战为辅,能少踩一个坑是一个。 852
上一篇: 面试时写不出排序算法?看这篇就够了
下一篇: 开放 API 接口签名验证,让你的接口从此不再裸奔
公众号-芋道源码
博客等级 码龄10年 1635粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值