现象描述

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true(引用相同,从缓存中取)Integer c = 200;
Integer d = 200;
System.out.println(c == b); // false(超出缓存范围,new Integer(200))

原因分析

Integer从Java 5开始,引入了缓存机制,用于缓存一定范围内的Integer对象。

  • 默认缓存范围是-128~127
  • 这些值对应的Integer对象在JVM启动时就被创建,并缓存在内存中

Integer缓存与JVM的关系

Integer中有一个静态内部类

private static class IntegerCache {static final int high;static final Integer cache[];static {final int low = -128;// high value may be configured by propertyint h = 127;if (integerCacheHighPropValue != null) {// Use Long.decode here to avoid invoking methods that// require Integer's autoboxing cache to be initializedint i = Long.decode(integerCacheHighPropValue).intValue();i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - -low);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {}}

从JVM初始化的配置中获取integerCacheHighPropValue,如果大于127,那么初始化的最大值就是integerCacheHighPropValue
cache数组的个数是hight-low+1
在cache中初始化从low到high的数字

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

当调用Integer.valueOf的时候,如果i的范围在-127~IntegerCache.high,就直接从缓存中取。因为是从缓存中直接获取的,所以即使多次获取,对象的内存地址是相同的。
但是如果i不在这个范围内,那么回返回一个新的对象,这时即使i的数字相同,但多个对象的内存地址不同。用==来比较,结果会是false.

编码

Integer a = 200;
Integer b = 200;
int c = 200;// ❌ 危险:结果依赖缓存
System.out.println(a == b); // false// ✅ 安全:比较值
System.out.println(a.equals(b)); // true// ✅ 安全高效
System.out.println(a == c); // true(拆箱比较)// ✅ 最安全(推荐)
System.out.println(Objects.equals(a, b)); // true
  • Integer VS Integer:必须用equals()Object.equals
  • Integer VS int:用==更安全、更高效
  • 为了避免null的问题,有限使用Objects.equals(a,b)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96006.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96006.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96006.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生物化学Learning Track(II)——多肽+蛋白质一级结构

本笔记基于杨荣武教授第四版《生物化学》&#xff08;持续更新&#xff09;1. 多肽我们在上一节笔记里面介绍了什么是氨基酸&#xff0c;还有氨基酸的种类以及氨基酸基本的一些性质如等电点极性手性等等&#xff0c;这里我们开始介绍氨基酸结合的产物&#xff0c;因为氨基酸是脱…

Caffeine Weigher

Weigher 接口Weigher 是 Caffeine 缓存库中一个非常重要的函数式接口&#xff0c;它用于计算缓存中每个条目&#xff08;entry&#xff09;的权重&#xff08;weight&#xff09;。这个权重值主要用于基于容量的驱逐策略&#xff0c;特别是当你希望缓存的总大小不是基于条目数量…

C/C++入门之搭建开发环境(VScode篇)

本文主要记录 Visual Studio Code 中配置 C/C 的开发环境&#xff0c;包括项目设置、编译选项和调试配置。VScode是编辑器&#xff0c;我们还需要安装编译器&#xff0c;才能实现编写程序到生成可执行文件这一流程。关于编辑器&#xff0c;编译器和IDE如果有些分不清&#xff0…

【营销策略算法】关联规则学习-购物篮分析

Apriori算法是关联规则学习领域中最经典、最著名的算法之一&#xff0c;用于从大规模数据集中发现有价值的关联规则。最典型的例子就是购物篮分析&#xff0c;通过分析顾客的购物篮&#xff0c;发现商品之间的关联关系&#xff0c;从而制定营销策略&#xff08;如“买尿布的顾客…

行为式验证码技术解析:滑块拼图、语序选词与智能无感知

随着传统字符验证码逐渐被 OCR 与自动化脚本攻破&#xff0c;越来越多业务开始采用 行为式验证码 来区分真人与机器。这类验证码不仅依赖用户的操作行为&#xff0c;还结合图形干扰、环境信息和风控模型&#xff0c;既提升了安全性&#xff0c;也改善了用户体验。 常见的实现方…

基于多项式同态加密和秘密共享的JPEG可逆信息隐藏

学习题为《Reversible steganography in cipher domain for JPEG images using polynomial homomorphism》的论文随着物联网&#xff08;IoT&#xff09;设备的普及&#xff0c;大量敏感数据&#xff08;如指纹、身份信息&#xff09;需要在云端传输和存储。传统隐写技术虽然能…

从 0 到 1 攻克订单表分表分库:亿级流量下的数据库架构实战指南

引言&#xff1a; 本文总字数&#xff1a;约 8500 字建议阅读时间&#xff1a;35 分钟 当订单表撑爆数据库&#xff0c;我们该怎么办&#xff1f; 想象一下&#xff0c;你负责的电商平台在经历了几个双十一后&#xff0c;订单系统开始频繁出现问题&#xff1a;数据库查询越来…

网络编程(5)Modbus

【1】Modbus 1. 起源Modbus由Modicon公司于1979年开发&#xff0c;是全球第一个真正用于工业现场的总线协议在中国&#xff0c;Modbus 已经成为国家标准&#xff0c;并有专业的规范文档&#xff0c;感兴趣的可以去查阅相关的文件&#xff0c;详情如下&#xff1a;标准编号为:GB…

WordPress性能优化全攻略:从插件实战到系统级优化

一、性能诊断&#xff1a;定位瓶颈是优化第一步 在对 WordPress 进行性能优化前&#xff0c;精准定位性能瓶颈至关重要。这就好比医生看病&#xff0c;只有先准确诊断&#xff0c;才能对症下药。下面将从核心性能指标检测工具和服务器基础性能排查两个方面展开。 1.1 核心性能…

十、网络与信息安全基础知识

1 网络概述 1.1 计算机网络的概念 1.1.1 计算机网络的发展 计算机网络的发展经历了四个主要阶段&#xff1a; 具有通信功能的单机系统&#xff1a; 早期形式&#xff1a;一台计算机连接多个终端。例子&#xff1a;20 世纪 50 年代的 SAGE 系统。 具有通信功能的多机系统&#x…

校园管理系统|基于SpringBoot和Vue的校园管理系统(源码+数据库+文档)

项目介绍 : SpringbootMavenMybatis PlusVue Element UIMysql 开发的前后端分离的校园管理系统&#xff0c;项目分为管理端和用户端和院校管理员端 项目演示: 基于SpringBoot和Vue的校园管理系统 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理…

新后端漏洞(上)- Weblogic SSRF漏洞

漏洞介绍&#xff1a;Weblogic中存在一个SSRF漏洞&#xff0c;利用该漏洞可以发送任意HTTP请求&#xff0c;进而攻击内网中redis、fastcgi等脆弱组件。编译及启动测试环境docker-compose up -d访问http://127.0.0.1:7001/uddiexplorer/&#xff0c;无需登录即可查看uddiexplore…

Fiddler 实战案例解析,开发者如何用抓包工具快速解决问题

在现代软件开发中&#xff0c;网络通信问题几乎是最常见的 Bug 来源。无论是前端调用后端 API、移动端与服务端交互&#xff0c;还是第三方 SDK 请求&#xff0c;都会因为参数错误、环境差异、网络条件不稳定而出现各种难以复现的问题。 在这些场景下&#xff0c;日志往往并不…

【佳易王药品进销存软件实测】:操作简单 + 全流程管理,医药台账管理好帮手#软件教程全解析

前言&#xff1a; &#xff08;一&#xff09;试用版获取方式 资源下载路径&#xff1a;进入博主头像主页第一篇文章末尾&#xff0c;点击卡片按钮&#xff1b;或访问左上角博客主页&#xff0c;通过右侧按钮获取详细资料。 说明&#xff1a;下载文件为压缩包&#xff0c;使用…

【设计模式】UML 基础教程总结(软件设计师考试重点)

【设计模式】UML 基础教程总结(软件设计师考试重点) 统一建模语言(Unified Modeling Language,UML),是一种标准化的面向对象建模语言,用于可视化、规范化和文档化软件系统设计。 参考资料:UML基础教程资料(可用于软件设计师考试)! (关注不迷路哈!!!) 文章目录 【…

vite_react 插件 find_code 最终版本

vite_react 插件 find_code 最终版本当初在开发一个大型项目的时候&#xff0c;第一次接触 vite 构建&#xff0c;由于系统功能很庞大&#xff0c;在问题排查上和模块开发上比较耗时&#xff0c;然后就开始找解决方案&#xff0c;find-code 插件方案就这样实现出来了&#xff0…

Python+DRVT 从外部调用 Revit:批量创建梁(2)

接着昨天的示例&#xff0c;继续创建梁&#xff0c;这次展示以椭圆弧、Nurbs为轴线。 创建以椭圆弧为轴线的梁 椭圆弧曲线的创建&#xff1a; # 创建椭圆弧 def CreateEllipse(ctx : MyContext, z: float) -> DB.Curve:"""create a horizontal partial el…

Flutter × 鸿蒙系统:一文搞懂如何将你的 App 移植到 HarmonyOS!

摘要 Flutter 是一个高效的跨平台框架&#xff0c;开发者可以使用同一套代码快速部署到 Android、iOS 等主流平台。随着华为鸿蒙系统&#xff08;HarmonyOS&#xff09;的崛起&#xff0c;越来越多开发者希望能将已有的 Flutter 应用迁移到鸿蒙生态中运行。目前&#xff0c;通过…

QML Charts组件之主题与动画

目录前言相关系列ChartView 概述&#xff1a;主题与动画示例一&#xff1a;主题设置&#xff08;ChartTheme.qml&#xff09;图表与主题设置主题切换部分示例二&#xff1a;动画设置&#xff08;ChartAnimation.qml&#xff09;图表与动画属性部分分类轴与柱状图数据部分交互与…

【论文阅读】Security of Language Models for Code: A Systematic Literature Review

Security of Language Models for Code: A Systematic Literature Review 该论文于2025年被CCF A类期刊TOSEM收录&#xff0c;作者来自南京大学和南洋理工大学。 概述 代码语言模型&#xff08;CodeLMs&#xff09;已成为代码相关任务的强大工具&#xff0c;其性能优于传统方法…