应理解并正确使用Integer缓存池:只用valueOf()或自动装箱,禁用new;比较用equals()或Objects.equals();警惕null导致的NPE;注意其他包装类缓存范围各异。

避开 Integer 缓存池带来的性能与逻辑陷阱,关键不是“绕开缓存”,而是**理解它、尊重它、用对它**。缓存本身是性能优化手段,陷阱源于误用 == 比较、滥用 new、忽略空指针或跨类型混淆。
用对创建方式:只走 valueOf,禁用 new
Integer 缓存只对 Integer.valueOf(int) 和自动装箱(如 Integer i = 100;)生效;new Integer(100) 总是新建对象,既浪费内存,又破坏缓存复用,且该构造器自 Java 9 起已标记为 @Deprecated。
- ✅ 推荐写法:
Integer a = 100;或Integer b = Integer.valueOf(200); - ❌ 危险写法:
Integer c = new Integer(100);—— 绕过缓存,对象不复用,== 必然失败
比较必须用 equals(),别信 ==
== 比较的是引用地址,而缓存机制让 -128~127 的值大概率复用同一对象,超出范围则几乎总是不同对象。这种“有时 true、有时 false”的行为极易引发线上 bug。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 安全写法:
if (a != null && a.equals(b))或Objects.equals(a, b)(自动判空) - ❌ 隐患写法:
if (a == b)—— 在测试中用 100 可能通过,上线后换成 1000 就出错 - ⚠️ 补充提醒:若确定非 null 且追求极致性能(如高频循环),可用
a.intValue() == b.intValue(),但需确保 a、b 不为 null
警惕自动拆箱导致的空指针
缓存池再高效,也救不了 null。从 Map、JSON、数据库查询等场景拿到的 Integer 很可能为 null,直接拆箱会立即抛 NullPointerException。
立即学习“Java免费学习笔记(深入)”;
- ✅ 安全写法:
int value = Optional.ofNullable(i).orElse(0);或显式判空:if (i != null) { int v = i; } - ❌ 高危写法:
int x = map.get("count");—— 若 key 不存在,get 返回 null,此处直接拆箱崩溃
了解其他包装类的缓存边界
Integer 的 -128~127 不是特例,但也不是通用规则。不同包装类缓存策略不同,混淆使用易出错:
- Byte / Short / Long:默认也是 -128~127(Long 的 high 不可配置)
- Character:只缓存 0~127(对应 ASCII 可见字符)
-
Boolean:只有
TRUE和FALSE两个实例,始终复用 -
Float / Double:无缓存 ——
Float.valueOf(1.0f) == Float.valueOf(1.0f)永远为 false


















