Character自动装箱缓存范围是\u0000到\u007F(0~127),因该范围覆盖ASCII高频字符,JVM启动时静态初始化128个对象缓存,valueOf(char)在此范围内返回缓存实例,否则新建对象。

Character 的自动装箱缓存范围是 \u0000 到 \u007F,也就是 0 到 127(含)。
为什么只缓存这 128 个字符?
这个范围对应 ASCII 可打印字符和控制字符的前 128 个码位,属于高频使用的字符子集。JVM 在启动时就静态初始化了一个长度为 128 的 Character 数组缓存,每个索引对应一个 char 值的对象实例。
源码中类似这样:
if (c- 超出该范围(如
'\u0080'或更高),每次都会新建Character对象
缓存对 == 比较的影响
自动装箱时是否命中缓存,直接影响引用相等性判断:
-
Character a = 'A'; Character b = 'A';→a == b为 true('A' 是 65,在 0–127 内) -
Character c = '\u0080'; Character d = '\u0080';→c == d为 false(超出缓存范围)
所以除非确认在 0–127 范围内,否则一律用 .equals() 比较两个 Character 实例。
和其他包装类的对比
Character 的缓存机制与 Byte、Short、Long 类似(都是固定 -128 ~ 127 或 0 ~ 127),但有两点不同:
- 缓存起始是 0,不是 -128(因为 char 是无符号 16 位,最小值为 \u0000)
- 该范围不可通过 JVM 参数调整,不像
Integer的 high 值可配置
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











