直接用基本类型数组(如int[])可彻底避开装箱,因其数据连续存储、零对象创建、无装箱拆箱开销;配合arrays工具类、intstream及fastutil等原始类型集合,能高效支撑统计、缓存、批量计算等场景。

直接用基本类型数组(如 int[]、double[])就能彻底避开装箱,因为它们不涉及任何对象创建,数据连续存储在堆上(或栈上,取决于作用域),零额外开销。
优先用原始数组替代包装类集合
当业务逻辑允许时,把 List<integer></integer> 或 ArrayList<integer></integer> 换成 int[] 是最直接的优化。比如统计、缓存、批量计算等场景:
- 初始化阶段就确定大小:用
int[] arr = new int[n];,后续所有读写都是纯数值操作; - 避免在循环中反复调用
list.get(i)→ 拆箱 → 计算 →list.set(i, x)→ 装箱; - 若需动态扩容,可先用
int[]积累,最后再转成集合(仅当必须交由泛型接口消费时)。
配合原始类型专用工具类处理常见操作
数组本身不带 add、remove、stream() 等方法,但可用轻量工具补足,不引入装箱:
- JDK 21+ 提供
Arrays.toString(int[])、Arrays.stream(int[])(返回IntStream,非Stream<integer></integer>); - 求和、查找、排序等直接调用
Arrays静态方法,例如Arrays.parallelSort(arr); - 需要类似
ArrayList的动态行为,选fastutil的IntArrayList或HPPC的IntArrayList,底层仍是int[],无任何包装对象。
警惕隐式装箱的“陷阱位置”
即使用了 int[],某些写法仍会触发装箱,尤其在与泛型 API 交互时:
-
别写
Arrays.asList(arr)—— 它把整个int[]当作一个元素(类型是int[]),不是你想要的List<integer></integer>;真要转,用IntStream.of(arr).boxed().collect(...),但仅在必要时做一次; - 方法参数是
Object...或接受Collection>时,传int[]会报错,此时应明确使用原始类型重载方法(如someMethod(int[] data)),而非妥协成Integer[]; - 日志或调试中写
log.info("values: {}", arr)不会装箱,但若误写成log.info("values: {}", Arrays.asList(arr)),就绕回了包装类路径。
与 Valhalla 值类型的协同思路
未来 JDK 若启用 Valhalla 的 @value 类,可将复杂结构也“扁平化”进数组,比如 @value final class Vec2 { int x, y; } 数组能像 int[] 一样紧凑布局。现阶段,对简单数值,int[] 就是最成熟、最可控的零装箱方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











