Java中Byte和Short包装类的缓存范围均为-128到127,通过静态内部类预创建对象实现;仅valueOf()和自动装箱触发缓存,new始终新建对象,超出范围或显式new均不共享引用。

Java 中 Byte 和 Short 包装类的缓存机制,是通过静态内部类预先创建并复用固定范围的对象来实现的,只在调用 valueOf() 方法或自动装箱时生效,而 new 方式始终新建对象,不走缓存。
Byte 缓存生效方式
Byte 类缓存了全部可能的 byte 值:-128 到 127(共 256 个),范围与 byte 类型取值范围完全一致,且不可配置。
生效条件:
- 使用
Byte.valueOf((byte)100)→ 返回缓存对象 - 写成
Byte b = 100;(自动装箱)→ 同样触发valueOf(byte),命中缓存 - 但
new Byte((byte)100)→ 总是新建对象,不参与缓存
源码关键逻辑(简化):
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[b + offset]; // b ∈ [-128,127] → 索引 ∈ [0,255]
}Short 缓存生效方式
Short 缓存范围也是 -128 到 127,和 Byte 一样固定、不可扩展。
生效条件:
-
Short.valueOf((short)50)→ 返回缓存中的Short实例 -
Short s = 50;(自动装箱)→ 调用valueOf(short),命中缓存 -
new Short((short)50)→ 绕过缓存,生成新对象
内部缓存数组初始化逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 静态块中一次性创建 256 个
Short对象,对应-128 ~ 127 -
valueOf()根据输入值计算偏移索引(如50 + 128 = 178),直接取数组元素
缓存是否生效的判断要点
- ✅ 自动装箱(如
Byte b = 10;)和valueOf()方法调用才走缓存 - ❌
new构造器永远不走缓存,哪怕值在范围内 - ✅ 相同值的缓存对象是同一个引用,可用
==比较(仅限缓存范围内) - ❌ 超出
-128~127的Short或Byte值(如Short.valueOf((short)200))会返回新对象
实际验证示例
Byte b1 = 100, b2 = 100; System.out.println(b1 == b2); // true(同引用) Byte b3 = new Byte((byte)100); System.out.println(b1 == b3); // false(不同对象) Short s1 = -128, s2 = -128; System.out.println(s1 == s2); // true Short s3 = Short.valueOf((short)128); // 超出缓存范围 Short s4 = Short.valueOf((short)128); System.out.println(s3 == s4); // false(各自 new)
不复杂但容易忽略
立即学习“Java免费学习笔记(深入)”;

















