You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:48:17