涨姿势:为什么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基础面试的经典考点。 阅读详情

为什么 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

你会得到

falsetrue

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

因此,后面一条语句也应该是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); //
}

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

相关推荐

Java FutureTask本质解析:任务状态契约与假异步陷阱

FutureTask是Java并发中连接Callable、ExecutorService和Future的核心契约实现,其本质并非异步工具,而是一个具备状态机(NEW→COMPLETING→NORMAL/EXCEPTIONAL)的可执行任务容器。它通过AtomicInteger管理生命周期,用WaitNode链表+LockSupport.park实现get()阻塞,但所有阻塞行为均取决于state字段而非线程调度。正因如此,未配合超时的get()极易引发线程池耗尽,而isDone()仅表示任务终结(含失败/取

weixin_33910460的博客 400

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

Java中Integer类的自动装箱机制利用了整数缓存池(默认-128到127),通过Integer.valueOf()方法复用缓存对象。当数值在缓存范围内时,返回同一对象引用(==比较为true),超出范围则创建新对象(==比较为false)。类似机制也存在于其他包装类如Byte、Short等。比较包装类对象时应使用equals()而非==,避免因缓存范围导致的误判。可通过JVM参数调整缓存上限,但需谨慎使用。该设计采用享元模式,优化了小整数场景的性能和内存开销。

油墨香^-^的博客 768

Python读取properties文件的正确姿势:jproperties实战指南

Properties文件是Java生态广泛使用的配置格式,其语义规则包括Unicode转义、变量插值、注释保留和无Section扁平结构,与Python原生ConfigParser存在根本性不兼容。理解这一差异是实现稳定配置解析的前提。jproperties作为纯Python实现的RFC 850兼容解析器,支持自动编码探测、递归变量展开和注释元数据提取,成为跨语言配置治理的关键桥梁。它不仅解决中文乱码、`${key}`展开、多环境profile加载等高频痛点,更可无缝对接Pydantic实现类型安全与IDE

weixin_34252686的博客 336

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的博客 78

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

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

weixin_33957648的博客 603

Java后端高效学习路径:场景驱动、原理深挖与AI辅助实战

最近和几位刚拿到大厂Offer的朋友交流,发现一个普遍现象:很多Java开发者工作几年后,技术栈看似丰富,但面对复杂场景和深度追问时,总感觉“差点意思”。无论是面试中的系统设计,还是实际工作中的性能调优,都难以形成体系化的解决方案。究其原因,往往是学习路径过于零散,缺乏一个能串联起核心知识、贴近实战、并能快速反馈的成长闭环。 本文旨在分享一套经过验证的高效学习路径,它融合了 场景化实战、高频八股、底层原理与AI辅助 ,特别适合希望在短期内(如1-3个月)实现技术能力显著跃升的Java后端开发者。无论你是准备

迷彩风情 425

奇怪的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

别再用Thread.sleep了!解决HttpClient报错 ‘Software caused connection abort‘ 的正确姿势

本文深入解析Java中`java.net.SocketException: Software caused connection abort`错误的根本原因,并提供工程化解决方案。通过优化HttpClient连接池配置、服务端优雅关闭实践及高级监控方案,彻底解决连接中断问题,替代低效的Thread.sleep方案。文章还介绍了异步HttpClient和HTTP/2协议等现代技术方案。

weixin_30730053的博客 552

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

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

weixin_42327291的博客 165

【数字IC设计】Centos 7桌面版 安装Synopsys EDA Tools

简称DC,是Synopsys公司用于做电路综合的核心工具,可以将HDL描述的电路转换为基于工艺库的门级网表。

qiumingT的博客 9793

Altair HyperWorks 2022.3.0 Suite下载

Altair HyperWorks开发团队提供了新的一流技术,以设计和优化高性能、高效和创新的产品,并发布了HyperWorks 2021.2套件。与所有新版本一样,这个版本包含了新特性、增强功能,并修复了前一个版本中用户报告的各种问题,提供了总体上更稳定的体验。链接: https://pan.baidu.com/s/1rYietmQLQUboHiJzYoE9WQ?pwd=m9yh 提取码: m9yh 复制这段内容后打开百度网盘手机App,操作更方便哦。

weixin_48469365的博客 2126

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

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

记录后端技术的深水区:MySQL、并发、JVM、分布式。原理为主,实战为辅,能少踩一个坑是一个。 851

GPS卫星轨道的理论和计算笔记分享

广义相对论预测,对比在时空弯曲度较大的地面上的原子钟,运行于时空弯曲度较小的卫星原子钟在地面上看起来更快,每天快约45us;反过来,当电压施加在晶体上时,晶体形状会扭曲(比如说伸长),而当晶体被施加上反向电压后,它将做相反的变形运动(比如缩短)。X轴:指向参考子午面与地球赤道的一个交点;从北黄极上方观察,地球北极在空间的运动轨迹是一个近似于以北黄极为中心的顺时针方向旋转的圆周,圆周半径等于。从上万年周期看,地球北极绕北黄极做大圆周运动,而从几年的短期来看,北极又在某一点处做局部的小幅椭圆运动。

m0_57139844的博客 2003

Java字符串编程:从基础语法到生产级鲁棒性实践

字符串是Java中最基础也最易被低估的数据类型,其设计融合了不可变性、常量池、UTF-16编码与内存模型等核心机制。理解String底层原理,是掌握JVM运行时行为、避免NPE/内存泄漏/乱码/性能退化等问题的前提。尤其在高并发、国际化和长周期运行的生产系统中,`==`误用、`+`拼接循环、`substring()`引用泄漏、代理对(Surrogate Pair)处理不当等常见错误,往往成为线上故障的隐形源头。本文聚焦String Programs in Java这一高频实战领域,结合Unicode鲁棒性、

weixin_30381317的博客 421

瑞数6.5逆向实战:手把手教你用RPC搞定cookie sign加密(附环境补全技巧)

本文深入解析瑞数6.5逆向实战,重点探讨如何结合环境补全与RPC调用技术来应对其动态加密机制。文章详细介绍了环境指纹采集、双重验证等核心防护原理,并提供了基于Puppeteer的RPC实现方案,手把手教你搞定cookie sign加密,附有实用的环境补全技巧与完整代码示例。

weixin_29315091的博客 1273

(四)DDR协议命令波形时序一——(ACT、Read、Write)

文章目录一、DDR命令真值表二、ACT激活命令时序要求2.1、ACTIVATE波形——tRRD、tFAW2.2、ACTIVATE波形——tRAS、tRC三、Read命令时序要求3.1、Read 波形——无Additive Latency3.2、Read 波形——有Additive Latency3.3、Read 波形——Additive Latency使用场景 一、DDR命令真值表 DDR的Command命令由CKE、CS#、RAS#、CAS#、WE#信号组成,这几个信号进行不同的搭配组合会形成不同的Co

Mr.翟的博客 6867
上一篇: 室温超导真要来了?一文读懂来龙去脉
下一篇: bug怎样算修完?浅谈团队分布式bug管理 —— git-poison简单易用的bug管理工具
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论 30
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值