根本解法是直接使用基本类型:int、long、double等,避免自动装箱拆箱带来的对象创建、GC压力和性能损耗;循环索引、累加器、临时变量必须用原始类型,集合操作优先选用IntList等原生基本类型集合库。

直接用基本类型,别让 int 变成 Integer,这是最根本的解法。自动装箱不是语法糖,是实打实的对象创建和方法调用,频繁发生就会拖慢程序、涨堆内存。
循环和计数器必须用原始类型
for 循环索引、累加变量、临时中间值,一律声明为 int、long、double 等,而不是包装类。
- ❌ 错误:Integer sum = 0; for (Integer i = 0; i < 10000; i++) { sum += i; } —— 每次 += 都触发一次拆箱 + 计算 + 装箱
- ✅ 正确:int sum = 0; for (int i = 0; i < 10000; i++) { sum += i; }
- 注意:即使只写 Integer i = 0,循环开始前就已装箱;i++ 这种操作也会反复拆箱再装箱
集合存取优先选原始类型专用库
ArrayList<Integer> 存的是对象,每个元素都是堆上分配的 Integer 实例。大数据量时,这开销非常明显。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 替代方案:用 Eclipse Collections 的 IntList、Trove 的 TIntArrayList 或原生 int[]
- 如果必须用标准集合,且只做简单存储读取(不参与运算),可接受;但一旦涉及求和、比较、过滤等操作,立刻切回基本类型上下文
- Stream 处理 int 数据时慎用 Stream<Integer>,考虑用 IntStream 替代
日志、参数传递、三元表达式要防隐式装箱
这些地方看着没写 new,却可能悄悄触发装箱,尤其在高频调用路径中。
立即学习“Java免费学习笔记(深入)”;
- 日志:log.info("count: {}", count) —— 若 count 是 Integer,SLF4J 会自动调用 toString() 或参与 boxing;传 int 才真正零开销
- 三元表达式:int x = flag ? obj.getValue() : 0;若 getValue() 返回 Integer 且可能为 null,这里会直接 NPE;应先判空或用 Objects.requireNonNullElse(obj.getValue(), 0)
- 方法参数:接收 Integer 的方法,若内部要做计算,先转成 int 再处理,避免在运算链路中反复拆箱
需要缓存时明确用 valueOf,禁用 new
Integer.valueOf(100) 有缓存(-128 ~ 127),而 new Integer(100) 绕过缓存、强制新建对象——后者在 JDK 9+ 已废弃。
- 统一使用 Boolean.valueOf()、Long.valueOf()、Double.valueOf() 等静态工厂方法
- 不要依赖 == 比较包装类值,哪怕数值在缓存范围内;一律用 Objects.equals(a, b),它安全且语义清晰
- 对第三方返回的包装类,不假设其来源,始终按可能为 null 处理

















