System.arraycopy本身不支持直接合并多个数组,需先创建总长度足够的目标数组,再分多次调用并手动计算每次复制的起始偏移量,注意类型一致、非空校验及边界检查。

System.arraycopy 本身不直接支持“合并多个数组”,它只负责把一个数组的某段内容,高效复制到另一个已有数组的指定位置。所以想用它合并多个数组,核心思路是:先创建一个足够大的目标数组,再分多次调用 arraycopy,把每个源数组的内容依次“拼接”进去。
准备一个容量足够的目标数组
合并前必须知道所有源数组的总长度,否则无法分配合适大小的目标数组。比如要合并三个 int[]:a(长度3)、b(长度2)、c(长度4),目标数组长度就得是 3 + 2 + 4 = 9。
- 用
new int[a.length + b.length + c.length]创建目标数组 - 类型必须一致(都是
int[]、String[]等),否则编译不通过 - 不能用
Object[]混装不同类型的数组——arraycopy是类型敏感的
按顺序逐个复制,注意起始偏移量
每次复制都要算准目标数组里的写入位置。第一次从索引 0 开始,第二次从 a.length 开始,第三次从 a.length + b.length 开始……这个偏移量必须手动累加,arraycopy 不会自动维护。
System.arraycopy(a, 0, result, 0, a.length);System.arraycopy(b, 0, result, a.length, b.length);System.arraycopy(c, 0, result, a.length + b.length, c.length);
处理非基本类型数组(如 String[])同样适用
只要数组元素类型相同,arraycopy 就能工作。对引用类型,它复制的是引用(不是对象本身),这点和基本类型一样高效。
- 例如合并两个
String[]:arr1 = {"a","b"}、arr2 = {"c","d","e"} - 目标数组声明为
String[] result = new String[arr1.length + arr2.length]; - 两次调用
arraycopy后,result就是{"a","b","c","d","e"}
注意边界和异常
arraycopy 不做自动扩容或越界保护,参数错一点就抛 ArrayIndexOutOfBoundsException 或 NullPointerException。
- 确保源数组非 null,且
srcPos + length ≤ src.length - 确保目标数组非 null,且
destPos + length ≤ dest.length - 长度参数不能为负数
- 建议在调用前加简单校验,尤其当数组来自外部输入时

















