java中用system.arraycopy合并数组需先创建足够大的目标数组,再分次复制源数组内容,核心是准确控制src、srcpos、dest、destpos和length五个参数,避免越界与类型不匹配。

Java 中用 System.arraycopy 合并数组,核心在于控制好源数组、目标数组、起始偏移和复制长度这四个参数,避免越界或覆盖错误。
理解 System.arraycopy 的参数含义
该方法签名是:System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)。它不创建新数组,只做内存块复制,所以必须提前准备好足够大的目标数组。
- src:源数组(要复制内容的数组)
- srcPos:从源数组哪个索引开始复制(从 0 开始)
- dest:目标数组(接收复制内容的数组)
- destPos:复制到目标数组的起始位置
- length:要复制多少个元素(不是结束索引)
合并两个一维数组的典型写法
假设要合并 arr1 和 arr2 成一个新数组,步骤是:先创建容量足够的新数组,再分两次调用 arraycopy,分别把两个源数组内容“拼接”进去。
- 新数组长度 =
arr1.length + arr2.length - 第一次复制:把
arr1全部(从索引 0 开始,复制arr1.length个)拷贝到新数组索引 0 处 - 第二次复制:把
arr2全部拷贝到新数组索引arr1.length处
示例代码片段:
int[] arr1 = {1, 2};int[] arr2 = {3, 4, 5};
int[] merged = new int[arr1.length + arr2.length];
System.arraycopy(arr1, 0, merged, 0, arr1.length);
System.arraycopy(arr2, 0, merged, arr1.length, arr2.length);
合并时常见陷阱与规避方式
实际操作中容易出错的地方集中在边界计算和类型匹配上。
- 复制长度超过源数组剩余元素数 → 抛
ArrayIndexOutOfBoundsException,务必确保srcPos + length ≤ src.length - 目标位置加长度超出目标数组长度 → 同样抛异常,检查
destPos + length ≤ dest.length - 源和目标数组类型不兼容(比如 int[] 复制到 String[])→ 编译不通过,注意泛型擦除后数组类型必须一致
- 误把
length当作“复制到第几个索引”→ 它是元素个数,不是结束下标
扩展:合并多个数组或处理对象数组
原理相同,只是调用次数增加。对对象数组(如 String[]),只要类型匹配,arraycopy 也能高效复制引用,无需深拷贝。
- 合并三个数组:创建总长度的新数组,依次用三次
arraycopy,每次更新destPos(前一次的结束位置) - 对象数组合并与基本类型写法一致,但要注意:复制的是引用,原数组元素修改会影响合并后数组中的对应位置
- 如果需要深拷贝对象,需额外遍历并调用 clone() 或构造新实例,
arraycopy本身不负责这个
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











