java包装类缓存机制影响==比较结果:byte、short、integer(-128~127,默认可扩)、long、character(0~127)带缓存;float、double无缓存;boolean仅复用true/false静态常量,不属范围缓存。

Java 中部分包装类内置了对象缓存机制,目的是复用高频小值、减少对象创建开销;而另一些则完全不缓存。这个区别直接影响 == 比较结果和内存行为,不能凭直觉判断。
带缓存机制的包装类(共 5 类)
- Byte:缓存全部取值范围,即 -128 到 127(闭区间),不可配置
- Short:缓存 -128 到 127,范围固定,不可调整
-
Integer:默认缓存 -128 到 127,上限可通过 JVM 参数
-Djava.lang.Integer.IntegerCache.high=xxx扩展(如设为 500),下限 -128 固定 - Long:缓存 -128 到 127,范围固定,不可配置
- Character:缓存 0 到 127(对应 ASCII 可见字符及控制符),不可配置
✅ 缓存生效条件:必须通过
valueOf()或自动装箱(如Integer i = 100;)触发;new Integer(100)绕过缓存,总新建对象。
完全不带缓存机制的包装类(共 3 类)
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Float:浮点数值离散且无限密集,缓存无实际意义,每次
valueOf()都返回新对象 -
Double:同 Float,不缓存,
Double.valueOf(1.0) == Double.valueOf(1.0)恒为false -
Boolean:严格来说不是“缓存”,而是直接复用两个静态常量
Boolean.TRUE和Boolean.FALSE;它没有动态缓存数组,也不支持其他布尔值(只有 true/false 两种可能)
⚠️ 注意:
Boolean虽然只返回两个固定实例,但它是通过静态 final 字段实现的,不属于“范围缓存”机制,因此归类为「无传统缓存」更准确。
总结对比
| 包装类 | 是否缓存 | 缓存范围 | 是否可配置 |
|---|---|---|---|
| Byte | 是 | -128 ~ 127 | 否 |
| Short | 是 | -128 ~ 127 | 否 |
| Integer | 是 | -128 ~ 127(默认) | 是(仅上限) |
| Long | 是 | -128 ~ 127 | 否 |
| Character | 是 | 0 ~ 127 | 否 |
| Boolean | 否* | —(仅两个常量) | 否 |
| Float | 否 | — | — |
| Double | 否 | — | — |
*注:Boolean 的 TRUE/FALSE 是静态常量复用,非缓存机制,不参与 valueOf(int) 式的范围管理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










