自动装箱是集合操作的性能隐形杀手,应有意识绕开热路径装箱:优先用int[]替代List,用IntArrayList等原始类型集合,批量解包一次到位,计数累加用int而非Integer。

集合操作中自动装箱是性能隐形杀手,尤其在高频增删、遍历或数值计算时。核心不是“禁用”,而是“有意识地绕开”——让装箱只发生在必要边界,而非热路径内部。
优先用原始类型数组替代 List
如果数据只读、长度固定或可预估,直接用 int[] 替代 List<integer></integer>。这能彻底消除每次 add() 或 get() 的装箱/拆箱指令。
- 添加元素?改用
Arrays.copyOf()手动扩容(仅少量操作时) - 需要动态增删?考虑
IntArrayList(Eclipse Collections)或TIntArrayList(Trove),它们底层全用int[],无任何包装对象 - 示例:循环求和从
List<integer> list</integer>改为int[] arr,JVM 字节码里不再出现Integer.valueOf()或intValue()
批量转换,别在循环里反复拆箱
若必须用 List<integer></integer>(比如来自外部 API),把解包动作一次性做完,后续所有计算都走原始类型。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 错误写法:
for (Integer x : list) { sum += x * x; }→ 每次迭代都调用x.intValue() - 正确写法:
int[] raw = list.stream().mapToInt(Integer::intValue).toArray(); for (int x : raw) { sum += x * x; }→ 解包只发生一次 - 多次遍历同一集合?缓存这个
int[],复用它,避免重复转换
警惕“看起来没问题”的累加与计数场景
集合相关计数器、累加器、索引变量,一律用 int,不用 Integer。
立即学习“Java免费学习笔记(深入)”;
- 错:
Integer count = 0; for (Integer item : list) { count++; }→ 每次++都触发拆箱+装箱 - 对:
int count = 0; for (Integer item : list) { count++; }→ 只有item拆箱一次,count始终是原始类型 - 同理,
for (int i = 0; i 中的 <code>i必须是int,不是Integer
用 IntStream 替代传统 for-each 处理数值集合
当逻辑适合函数式风格,IntStream 是更安全的原始类型抽象。
-
list.stream().mapToInt(Integer::intValue).sum()比list.stream().reduce(0, Integer::sum)少两层装箱 - 支持并行:
.parallel()时,IntStream不会因装箱导致线程间对象竞争或 GC 波动 - 注意:仅适用于纯数值运算;若需保留
null或做对象方法调用,则不适用

















