0

0

Java中的装箱缓存机制是什么_IntegerCache的高频区间与性能影响

P粉602998670

P粉602998670

发布时间:2026-03-16 14:01:36

|

944人浏览过

|

来源于php中文网

原创

Integer.valueOf() 在 -128 至 127 范围内返回缓存对象,超出则新建对象,导致 == 比较结果不稳定;应始终用 equals() 比较值,避免装箱陷阱。

java中的装箱缓存机制是什么_integercache的高频区间与性能影响

Integer.valueOf() 为什么有时返回缓存对象,有时新建对象

因为 Integer.valueOf(int) 内部会查一个静态缓存数组 IntegerCache.cache,范围是 -128 到 127(含)。在这个区间内,每次调用都返回同一个 Integer 实例;超出就 new 一个新对象。

这直接导致 == 比较结果不稳定:两个值都是 100 时可能为 true,都是 200 时却为 false

  • 缓存区间不可配置(JDK 5–21 均为 -128~127,仅可通过 JVM 参数 -XX:AutoBoxCacheMax=xxx 扩大上限,但不推荐)
  • new Integer(100) 总是新建对象,绕过缓存,和 valueOf() 行为不同
  • 其他包装类也有类似机制:ByteShortCharacter 缓存固定范围;LongInteger 一样可调上限;FloatDouble 不缓存

什么时候会意外触发 == 比较失效

常见于用 == 判断两个 Integer 是否相等,尤其在集合操作或流式处理中容易忽略装箱细节。

比如从 Map<integer string></integer> 取 key 时用 == 判断是否命中,或者在 Stream.filter(x -> x == 128) 中漏掉匹配——因为 128 被装箱成新对象,跟字面量 128 的包装结果不是同一引用。

立即学习Java免费学习笔记(深入)”;

  • 永远优先用 .equals() 比较包装类值,除非你明确知道两者都在缓存区间且共享同一实例
  • 编译期常量(如 Integer a = 100;)会被自动优化为 valueOf(100),但运行时计算出的值(如 int x = 100; Integer b = x;)也走 valueOf(),行为一致
  • 反模式示例:Integer a = 128; Integer b = 128; System.out.println(a == b); // false

IntegerCache 的初始化时机与内存开销

IntegerCache 是个静态内部类,在 Integer.valueOf() 第一次被调用时才初始化,属于懒加载。缓存数组长度默认 256(-128 到 127),每个元素是一个 Integer 对象,总内存占用极小(约几 KB)。

会译·对照式翻译
会译·对照式翻译

会译是一款AI智能翻译浏览器插件,支持多语种对照式翻译

下载

但要注意:它在类加载后长期驻留堆中,不会被 GC 回收,哪怕你只用了其中几个值。

  • 缓存对象在 JVM 启动后即创建并保持强引用,生命周期等同于 Integer 类本身
  • 扩大缓存上限(如 -XX:AutoBoxCacheMax=500)会提前创建更多对象,增加初始堆压力,且对绝大多数业务无实际收益
  • 没有“清空缓存”机制,也不该试图反射破坏它——破坏后 valueOf() 行为未定义

替代方案:什么时候该避免自动装箱

高频数值计算、循环内频繁装箱/拆箱(如 for (Integer i : list) sum += i;),会因缓存缺失或对象分配带来额外开销。

这不是缓存机制的问题,而是装箱本身带来的 GC 和间接寻址成本。

  • 性能敏感路径优先用基本类型:int 而非 Integerlong 而非 Long
  • 集合操作中,考虑 IntStream 替代 Stream<integer></integer>,避免每项都装箱
  • 自定义容器(如 FastUtil、Trove)提供原生 int 版本 Map/List,彻底绕过装箱
  • 注意 OptionalInt 等原始类型特化类,比 Optional<integer></integer> 更轻量

缓存只是装箱机制的一层优化,真正要防的是把包装类当基本类型用,又指望它没开销。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

597

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

617

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

335

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

335

2025.08.29

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号