0

0

Java里的基本类型包装类缓存池原理_Integer/Long等范围说明

P粉602998670

P粉602998670

发布时间:2026-03-01 09:55:50

|

907人浏览过

|

来源于php中文网

原创

java里的基本类型包装类缓存池原理_integer/long等范围说明

Integer.valueOf() 为什么有时 == 有时 !=

因为 Integer 对 -128 到 127 的整数做了缓存,调用 valueOf() 时直接返回池中对象;超出范围就 new 新对象。所以两个 Integer== 比较,只在缓存范围内才可能为 true

  • 缓存启用条件:必须通过 valueOf() 或自动装箱(如 Integer i = 100;),new Integer(100) 永远不进池
  • 缓存范围可调:JVM 启动参数 -XX:AutoBoxCacheMax=200 能扩大上限(仅对 Integer 有效,Long 等不支持)
  • 比较务必用 .equals():哪怕你确定值在 -128~127,一旦未来参数调整或换 JDK 版本,== 就会悄无声息出错

Long、Short、Byte、Character 的缓存行为差异

ByteShortCharacter 的缓存范围是固定的,LongInteger 表面类似但实现不同——只有 Integer 支持 JVM 参数调节缓存上限。

  • ByteShortCharacter:固定缓存全部合法值(Byte 是 -128~127,Character 是 \u0000~\u007f)
  • Long:也缓存 -128~127,但 -XX:AutoBoxCacheMax 对它无效,硬编码不可改
  • Boolean:只缓存 TRUEFALSE 两个实例,没范围概念
  • FloatDouble:不缓存,每次 valueOf() 都 new 新对象

缓存池在哪?怎么验证它存在

缓存池是每个包装类内部的 static final 数组或对象池,比如 Integer 的缓存存在 Integer.IntegerCache.cache 里,是包私有的,不能直接访问,但能间接验证。

如此AI员工
如此AI员工

国内首个全链路营销获客AI Agent

下载
  • 验证方法:写两行 Integer a = 127; Integer b = 127;,再 a == b 返回 true;换成 128 就变 false
  • 反编译字节码可见:自动装箱语句 Integer i = 100; 实际被编译成 Integer.valueOf(100)
  • 注意 JDK 版本:JDK 5 引入缓存,JDK 9+ 未改动逻辑,但某些 GraalVM 或定制版 JDK 可能有差异

为什么 String 也有类似现象但原理完全不同

String 字面量复用(如 "abc" == "abc")靠的是字符串常量池(runtime constant pool),而包装类缓存是堆内存里的静态对象数组,两者内存区域、管理机制、触发条件都不同,别混为一谈。

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

  • 字符串常量池可被 String.intern() 手动介入;包装类缓存完全透明,无法手动增删
  • 字符串池大小可调(-XX:StringTableSize),包装类缓存大小只跟范围有关,不占额外调优入口
  • 最易错点:看到 Integer i = 100; String s = "100"; 都“复用”,就以为它们是一回事——其实一个是堆上共享对象,一个是方法区里符号引用匹配

缓存池不是语法糖,是明确写死在 JDK 源码里的优化逻辑;依赖它做对象相等判断,等于把业务逻辑绑在 JVM 实现细节上。真要安全,老老实实用 .equals(),哪怕多一次空指针检查。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

890

2023.08.02

css中float用法
css中float用法

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

592

2024.04.28

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

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

105

2025.10.23

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

365

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

40

2025.11.30

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

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

1560

2023.10.24

字符串常量的表示方法
字符串常量的表示方法

字符串常量的表示方法:1、使用引号;2、转义字符;3、多行字符串;4、原始字符串;5、字符串连接;6、字符串字面量和对象;7、编码问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

143

2023.12.26

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

658

2023.08.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

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

精品课程

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

共23课时 | 4万人学习

C# 教程
C# 教程

共94课时 | 10.5万人学习

Java 教程
Java 教程

共578课时 | 74.8万人学习

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

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