Java中Short缓存-128~127,Byte缓存全部256个合法值;Short.valueOf超出范围新建对象,Byte.valueOf总命中缓存;==比较仅在缓存范围内可靠,推荐用equals()。

Java 中 Short 和 Byte 的缓存机制是 JVM 为提升性能而内置的轻量级对象复用策略,核心目标是避免对高频小整数反复创建新对象。
Short 缓存范围与行为
Short 类默认缓存数值在 -128 到 127(含)之间的所有值。
- 调用
Short.valueOf(short s)时,若s在该范围内,直接返回缓存数组中的已有对象; - 若超出范围(如
128或-129),则每次调用都新建Short实例; - 缓存不可通过系统属性配置,范围固定,由静态内部类
ShortCache实现; - 源码中判断逻辑类似:
if (s >= -128 && s <= 127) { return ShortCache.cache[s + 128]; }
Byte 缓存范围与行为
Byte 的缓存更彻底:它缓存了 byte 类型的全部合法取值,即 -128 到 127 共 256 个值。
- 所有
Byte.valueOf(byte b)调用,无论传入何值(只要不越界),都命中缓存; - 因为
byte本身只有 256 种可能,JVM 直接预加载全部对应对象到静态数组ByteCache.cache[]; - 源码中无条件查表:
return ByteCache.cache[(int)b + 128]; - 若传入非法值(如
128),会抛NumberFormatException,根本不会进入缓存逻辑。
使用时的关键注意点
-
==比较仅在缓存内数值间才可靠(因指向同一对象),例如:Short a = 100, b = 100; System.out.println(a == b); // true Short x = 200, y = 200; System.out.println(x == y); // false
- 始终推荐用
equals()进行逻辑相等判断,避免因缓存边界导致行为不一致; - 缓存对象是单例、不可变、线程安全的,无需额外同步。
不复杂但容易忽略。
立即学习“Java免费学习笔记(深入)”;


















