system.arraycopy是java中复制数组最高效的方式,直接调用native方法,参数为src、srcpos、dest、destpos、length,需严格校验边界且不支持泛型与深拷贝。

System.arraycopy 是 Java 中复制数组最高效的方式之一,尤其适合一维数组的批量拷贝,它直接调用本地方法(native),绕过 Java 层循环,性能远超 for 循环或 Arrays.copyOf。
核心参数要记清
调用格式为:
System.arraycopy(src, srcPos, dest, destPos, length);
五个参数必须按顺序、类型正确传入:
- src:源数组(非 null)
- srcPos:从源数组哪个索引开始复制(≥0 且 ≤ src.length)
- dest:目标数组(非 null,类型需与 src 兼容)
- destPos:复制到目标数组的起始索引(≥0 且 ≤ dest.length)
- length:要复制的元素个数(≥0,且不能超出 src 剩余长度和 dest 剩余空间)
常见使用场景
复制整个数组、截取片段、合并数组、移动元素都可一步到位:
- 完整复制:
System.arraycopy(arr, 0, newArr, 0, arr.length); - 复制前 5 个元素:
System.arraycopy(arr, 0, newArr, 0, Math.min(5, arr.length)); - 把 arr[2]~arr[6] 拷贝到 newArr[1] 开始位置:
System.arraycopy(arr, 2, newArr, 1, 5); - 向后移动元素(如插入前腾位置):
System.arraycopy(arr, 3, arr, 4, 5);—— 将索引 3 起的 5 个元素移到索引 4 起
关键注意事项
这个方法不校验泛型,也不做深拷贝,使用时务必留意:
- 源和目标数组必须是同一类型或兼容类型(如 Object[] 可接收 String[]);否则运行时报 ArrayStoreException
- 如果 src 和 dest 是同一个数组,属于“自复制”,只要不重叠冲突就安全;若重叠(如 srcPos
- 不会自动扩容——目标数组必须已存在且足够大,否则抛出 ArrayIndexOutOfBoundsException
- 只复制引用(对象数组)或值(基本类型数组),不递归复制对象内部字段
对比 Arrays.copyOf 更适合什么情况
Arrays.copyOf 底层其实也调用了 System.arraycopy,但它会先新建数组:
- 需要新数组且长度可能变化 → 用 Arrays.copyOf(简洁,自动分配)
- 已有目标数组、追求极致性能、或需精确控制偏移 → 直接用 System.arraycopy
- 复制部分区间、原地移动、复用缓冲区 → 只能 System.arraycopy











