如何将ArrayList<int[]>扁平化转换为int类型原生数组?
实现方案
要把存储int数组的ArrayList按顺序拍平成一维原生int数组,核心逻辑分两步:先统计所有元素总长度提前初始化结果数组,再按顺序把每个子数组的元素拷贝到对应位置即可,下面是两种常用实现,可以根据项目的Java版本选择。
兼容所有Java版本的高性能原生实现
这个实现无额外依赖,用JDK自带的原生数组拷贝方法,性能最优,大数量场景优先选择:
import java.util.ArrayList; import java.util.Arrays; public class IntArrayFlattener { public static int[] flatten(ArrayList<int[]> source) { // 空入参直接返回空数组 if (source == null || source.isEmpty()) { return new int[0]; } // 计算最终数组总长度 int totalLen = 0; for (int[] subArr : source) { if (subArr != null) { totalLen += subArr.length; } } int[] result = new int[totalLen]; int copyPos = 0; for (int[] subArr : source) { if (subArr == null) { continue; } // native方法实现数组拷贝,比手写循环赋值效率高很多 System.arraycopy(subArr, 0, result, copyPos, subArr.length); copyPos += subArr.length; } return result; } // 测试验证 public static void main(String[] args) { ArrayList<int[]> al1 = new ArrayList<>(); al1.add(new int[]{1,1,1,1,1}); al1.add(new int[]{0,1,0,1,1}); al1.add(new int[]{0,0,0,0,0}); System.out.println(Arrays.toString(flatten(al1))); // 输出 [1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0],和预期结果一致 } }
Java 8+ 简洁Stream实现
如果项目使用Java 8及以上版本、不需要极致性能,可以用Stream写更精简的代码,逻辑更直观:
import java.util.ArrayList; import java.util.Arrays; import java.util.stream.IntStream; public class IntArrayFlattener { public static int[] flatten(ArrayList<int[]> source) { if (source == null || source.isEmpty()) { return new int[0]; } return source.stream() .filter(arr -> arr != null) .flatMapToInt(IntStream::of) .toArray(); } }
避坑提醒
- 不要用
List<Integer>做中转再转int数组,会产生频繁的装箱拆箱开销,性能差且代码冗余 - 不要在循环里每次拼接都新建数组拷贝全量旧内容,提前算好总长度一次性初始化数组,时间复杂度稳定在O(n)
- 不要遗漏null判断,不管是入参的ArrayList本身,还是里面存储的子数组,避免运行时抛出空指针异常
内容的提问来源于stack exchange,提问作者Vlad Bird
相关产品推荐
相关产品推荐

