long缓存默认为[-128, 127],因该范围覆盖高频使用场景、内存开销小(256个对象),且由longcache硬编码实现;仅valueof()和自动装箱命中缓存,new绕过缓存,比较应始终用equals()。

Java 中 Long 类型的缓存默认范围是 [-128, 127](含两端)。
为什么是这个范围?
Long 的缓存机制由其内部静态类 LongCache 实现,源码中硬编码了该区间:
- 缓存数组大小固定为 256 个元素(-128 到 127 共 256 个整数)
- 初始化时一次性创建所有对应值的
Long对象并存入数组 - 与
Integer不同,Long的缓存上限不可通过 JVM 参数(如-Djava.lang.Integer.IntegerCache.high)扩展
哪些操作会命中缓存?
只有通过以下方式创建的 Long 实例才可能复用缓存对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Long.valueOf(100)—— 推荐,走缓存逻辑 - 自动装箱:
Long l = 100L;—— 编译器转为valueOf调用
而 new Long(100) 总是新建对象,绕过缓存,且该构造方法在 Java 9+ 已被废弃。
超出范围或比较时要注意什么?
缓存只影响对象引用,不影响数值语义:
-
Long.valueOf(127) == Long.valueOf(127)返回true(同一对象) -
Long.valueOf(128) == Long.valueOf(128)返回false(不同对象) - 判断相等应统一用
.equals(),避免因缓存导致行为不一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










