只有integer支持通过jvm参数调整缓存上限,范围变为[-128, value];byte、short、long、character、boolean等缓存范围均硬编码固定不可调,float/double无缓存;需用equals()比较值相等。

Java 中包装类缓存范围只有 Integer 支持通过 JVM 参数调整,其他如 Byte、Short、Long、Character、Boolean 等的缓存范围在类加载时硬编码固定,无法运行时修改。
Integer 缓存上限可配置(下限 -128 固定)
JVM 提供 -XX:AutoBoxCacheMax=<value></value> 参数,用于扩大 Integer 缓存的上限值。默认是 127,设置后缓存范围变为 [-128, <value>]</value>。
-
✅ 正确用法示例:
启动应用时添加参数:java -XX:AutoBoxCacheMax=2000 MyApp
此时
Integer.valueOf(1500)和Integer i = 1500;都会命中缓存(只要 ≤ 2000)。
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
⚠️ 注意事项:
- 必须在 JVM 启动时指定,类加载完成后(
IntegerCache静态块已执行)不可再修改; - 该参数等价于系统属性
java.lang.Integer.IntegerCache.high; - 内存占用随范围线性增长,例如设为 200000 时,缓存数组约含 200129 个
Integer对象,堆内存增加约 2~3 MB; - 不建议设得过大(如超过 10 万),否则类加载变慢、GC 压力上升,且易掩盖
==误用问题。
- 必须在 JVM 启动时指定,类加载完成后(
其他包装类不支持 JVM 参数调整
| 包装类 | 默认缓存范围 | 是否可调 | 原因说明 |
|---|---|---|---|
Byte |
-128 ~ 127 | ❌ 否 |
ByteCache.cache 数组长度固定为 256 |
Short |
-128 ~ 127 | ❌ 否 | 源码中 ShortCache.cache 同样硬编码 |
Long |
-128 ~ 127 | ❌ 否 |
LongCache.cache 初始化即定长,无扩展入口 |
Character |
\u0000 ~ \u007F(0~127) |
❌ 否 | ASCII 范围固定,缓存数组长度 128 |
Boolean |
TRUE / FALSE
|
❌ 否 | 仅两个静态 final 实例,本质是常量复用 |
Float/Double
|
无缓存 | — | 浮点数精度和连续取值导致缓存无意义 |
替代方案:对不可调类型做显式缓存
当 Long、Short 等类型在业务中频繁使用超范围数值(如订单 ID、时间戳),可自行封装缓存:
- 使用
ConcurrentHashMap<long long></long>代理:private static final ConcurrentHashMap<long long> LONG_CACHE = new ConcurrentHashMap(); public static Long cachedLong(long v) { return LONG_CACHE.computeIfAbsent(v, Long::valueOf); }</long> - 可配合 LRU 策略(如 Caffeine)控制容量,避免无限膨胀。
比较时始终用 .equals() 或 .longValue() == .longValue(),不依赖 ==。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










