`==`、`equals` 和 Integer 缓存:为什么 `128 == 128` 是 false
前言先看一段能让人怀疑人生的代码Integera127,b127;System.out.println(ab);// trueIntegerc128,d128;System.out.println(cd);// false同样的写法只是把数值从127改成128的结果就从true翻成了false。第一次见到的人几乎都会愣一下这不科学。其实一点都不玄。背后是两个知识点的叠加比的到底是什么以及Integer有个-128~127的缓存。这篇文章把这两点讲透看完你不仅能解释 127/128还能躲开一整类包装类型比较的坑。环境说明本文基于 JDK 8。一、先复现把几种情况放一起现象更清楚publicclassIntegerEqualsDemo{publicstaticvoidmain(String[]args){Integera127,b127;System.out.println(127 127 : (ab));// trueIntegerc128,d128;System.out.println(128 128 : (cd));// falseIntegerenewInteger(127),fnewInteger(127);System.out.println(new 127 : (ef));// falseSystem.out.println(equals : c.equals(d));// true}}输出127 127 : true 128 128 : false new 127 : false equals : true三个反直觉的点127 127是true128 128却是false连new Integer(127) new Integer(127)都是false——明明值一样但只要改用equals全都是true。问题就一个到底在比什么为什么它对Integer这么不讲道理二、根因2.1比引用equals比内容这是总纲记住这一句能解决一大半问题对基本类型int、long、double…比的是值。对引用类型所有对象包括Integer比的是引用地址——也就是是不是同一个对象而不是值相不相等。Integer是对象所以c d问的其实是c和d是不是指向同一个对象而不是它们的值相不相等。new Integer(127) new Integer(127)为false就是这个道理new了两次是两个不同的对象地址自然不同哪怕值都是 127。而equals被Integer重写成了比较内部的int值所以只要值相等就返回true。那问题来了c、d又没new只是Integer c 128;为什么也是两个对象这就要说到自动装箱。2.2 自动装箱Integer a 127背后发生了什么Integer a 127;这行等号右边是int左边是Integer编译器会自动帮你装箱实际编译成IntegeraInteger.valueOf(127);注意是Integer.valueOf(127)不是new Integer(127)。这个区别是全部谜题的钥匙。2.3IntegerCache-128~127返回同一个缓存对象看Integer.valueOf的源码JDK 8publicstaticIntegervalueOf(inti){if(iIntegerCache.lowiIntegerCache.high)returnIntegerCache.cache[i(-IntegerCache.low)];// 命中缓存返回同一个对象returnnewInteger(i);// 超出范围new 新对象}Integer内部维护了一个静态缓存IntegerCache默认缓存-128到127这 256 个整数对应的Integer对象。逻辑很直白值在-128~127之间直接返回缓存里同一个对象超出这个范围new一个新对象。到这里127/128 的反转就彻底解释清楚了Integer a 127, b 127;→ 两次valueOf(127)都命中缓存返回的是同一个对象a b自然trueInteger c 128, d 128;→ 128 超出缓存范围两次各new一个新对象c d就是false。而new Integer(127)是显式new绕过了缓存所以哪怕在 127 也照样是两个对象为false。一张图看清valueOf的分支和缓存范围三、正解结论很简单包装类型比较值一律用equals别用。Integerc128,d128;// 有坑比的是对象地址结果随数值大小变化System.out.println(cd);// false// 正解比的是值永远可靠System.out.println(c.equals(d));// true几个补充想用也行但要先拆箱成基本类型c.intValue() d.intValue()或者让其中一边是int见下面第四节。注意equals的空指针如果变量可能为nullc.equals(d)会 NPE。用java.util.Objects.equals(c, d)更安全它内部做了 null 判断。同类陷阱Long、Short、Byte、Character都有类似缓存Double、Float没有缓存浮点值域连续缓存无意义。另外String有字符串常量池也有类似的坑——都是引用比较惹的祸。四、常见误区与面试高频问答Q为什么缓存范围偏偏是-128~127能改吗这是一个字节byte能表示的范围也是实践中小整数最常用的区间缓存它们收益最高。上界可以通过 JVM 参数-XX:AutoBoxCacheMaxsize调大下界固定-128。调大后原本128 128为false的结果可能变成true——这也从侧面证明了它就是缓存在起作用。Q基本类型int之间用有问题吗没有。基本类型的比的就是值128 128两个int永远是true。坑只出现在包装类型上。QInteger和int用比会怎样Integerc128;intx128;System.out.println(cx);// true当一边是基本类型、一边是包装类型时包装类型会自动拆箱成基本类型于是比的是值结果反而正常了。也就是说Integer int是安全的Integer Integer才有坑。Q既然equals更可靠是不是就没用了不是。判断是不是同一个对象比如判断单例、判断引用是否被重新赋值就得用。和equals是两个不同的问题问是不是同一个equals问值是不是相等。选哪个取决于你要问什么。Q为什么阿里手册强制包装类之间比较用equals正是因为本文这个坑。用比较包装类结果会随数值是否落在缓存范围而变化——127对、128错这种时对时错的 bug 极难排查还很容易在测试时用小数据蒙混过关、上线用大数据翻车。统一用equals就彻底避开了。总结128 128为false不是 JVM 有 bug而是两个机制叠加的必然结果对引用类型比的是对象地址是不是同一个对象不是值equals才比值。Integer a 127会自动装箱成Integer.valueOf(127)而valueOf对-128~127返回缓存的同一个对象超出范围则new新对象。所以127命中缓存是同一个对象为true128超范围是两个对象为falsenew Integer绕过缓存永远是新对象。一句话记忆比地址、equals比值Integer只缓存-128~127超了就是两个对象——包装类型比较永远用equals。

相关新闻

戴尔G15散热控制终极方案:告别过热降频的开源神器

戴尔G15散热控制终极方案:告别过热降频的开源神器

戴尔G15散热控制终极方案:告别过热降频的开源神器 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 戴尔G15游戏本用户是否经常遇到游戏卡顿、渲染缓…

2026/7/27 17:03:51 阅读更多 →
`volatile` 到底保证了什么:可见性、有序性,和它管不到的原子性

`volatile` 到底保证了什么:可见性、有序性,和它管不到的原子性

前言 有个 bug 特别典型:一个线程把开关 flag 改成了 true,另一个线程里 while (!flag) 的循环却像没听见一样,一直转个不停,就是不退出。 把 flag 加上 volatile,问题立刻消失。于是很多人得出一个模糊的结论&#xf…

2026/7/27 17:03:51 阅读更多 →
华为Bootloader解锁终极指南:用PotatoNV实现免拆机自由定制

华为Bootloader解锁终极指南:用PotatoNV实现免拆机自由定制

华为Bootloader解锁终极指南:用PotatoNV实现免拆机自由定制 【免费下载链接】PotatoNV Unlock the bootloader on Huawei devices with Kirin 620/65x/95x/960 项目地址: https://gitcode.com/gh_mirrors/po/PotatoNV 你是否对华为手机的系统限制感到束手无策…

2026/7/27 17:03:51 阅读更多 →

最新新闻

计算机毕业设计之基于SpringBoot的健康运动俱乐部管理系统设计与实现

计算机毕业设计之基于SpringBoot的健康运动俱乐部管理系统设计与实现

随着健康意识的不断提升,健康运动俱乐部逐渐成为人们日常生活的重要组成部分,然而,传统的管理方式已难以满足现代俱乐部的运营需求,因此,本文设计并实现了一个健康运动俱乐部管理系统。本系统采用SpringBoot作为后端框…

2026/7/27 17:40:06 阅读更多 →
从零到交付:AI海报设计全流程拆解,3小时掌握专业级出图能力

从零到交付:AI海报设计全流程拆解,3小时掌握专业级出图能力

更多请点击: https://intelliparadigm.com 第一章:AI海报设计的认知革命与行业价值 传统海报设计长期依赖专业设计师的经验积累与反复迭代,而AI技术的深度介入正重塑这一认知范式——它不再仅是工具升级,而是将创意生成、视觉推理…

2026/7/27 17:40:06 阅读更多 →
BQ28Z610-R1温度校准与I2C命令全解析:从原理到实践

BQ28Z610-R1温度校准与I2C命令全解析:从原理到实践

1. 项目概述与核心价值 在任何一个需要精确管理锂离子电池的嵌入式项目中,无论是消费电子、电动工具还是储能系统,电池电量计芯片都是确保安全、性能和用户体验的核心。我接触过不少方案,从简单的电压检测到复杂的阻抗跟踪算法,最…

2026/7/27 17:40:06 阅读更多 →
计算机毕业设计之基于springboot的健身房管理系统

计算机毕业设计之基于springboot的健身房管理系统

随着人们健康意识的提升与生活节奏的加快,健身房已成为大众追求健康生活方式的重要场所。然而,传统健身房管理模式面临诸多挑战,如会员信息管理混乱、课程安排与预约效率低下、场地资源分配不均、财务管理繁琐等问题日益凸显。这些问题不仅增…

2026/7/27 17:40:06 阅读更多 →
同步降压转换器设计实战:从TL5002控制器到PCB布局全解析

同步降压转换器设计实战:从TL5002控制器到PCB布局全解析

1. 项目概述与核心价值 在电源设计领域,尤其是为高性能处理器、FPGA或ASIC供电时,一个稳定、高效、响应迅速的直流电源是系统稳定运行的基石。同步降压转换器(Synchronous Buck Converter)因其远超传统异步降压拓扑的效率&#xf…

2026/7/27 17:40:06 阅读更多 →
如何快速创建专属桌面伙伴:开源虚拟伴侣框架完全指南

如何快速创建专属桌面伙伴:开源虚拟伴侣框架完全指南

如何快速创建专属桌面伙伴:开源虚拟伴侣框架完全指南 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 你是否曾想过让心爱的角色真正"活"在你的桌面上&#…

2026/7/27 17:39:06 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻