System.arraycopy是Java中性能最高的数组拷贝方式,直接调用JVM本地方法,跳过边界检查与对象创建开销;其语法为System.arraycopy(src, srcPos, dest, destPos, length),需严格校验参数合法性以避免异常。

用 System.arraycopy 拷贝数组,是 Java 中性能最高、最底层的数组复制方式——它直接调用 JVM 的本地方法,跳过边界检查(在 JIT 优化后)和对象创建开销,比 Arrays.copyOf 或循环赋值快得多。
一、System.arraycopy 基本用法与参数含义
语法固定,共 5 个参数,顺序不能错:
System.arraycopy(src, srcPos, dest, destPos, length);
-
src:源数组(不能为空,否则抛
NullPointerException) - srcPos:从源数组哪个索引开始复制(从 0 开始,必须 ≥ 0 且 ≤ src.length)
-
dest:目标数组(不能为空,且类型需与 src 兼容,否则抛
ArrayStoreException) -
destPos:复制到目标数组的起始位置(≥ 0,且
destPos + length ≤ dest.length,否则抛IndexOutOfBoundsException) - length:要复制的元素个数(≥ 0;若为 0,不报错,静默完成)
二、常见安全拷贝场景写法
避免运行时异常的关键是提前校验长度。实际开发中建议封装或配合断言使用:
-
完整拷贝(等长数组):
System.arraycopy(src, 0, dest, 0, src.length); -
截取前 N 个元素(N ≤ src.length):
System.arraycopy(src, 0, dest, 0, Math.min(N, src.length)); -
从中间拷贝一段(如第 2 个起复制 3 个):
System.arraycopy(src, 1, dest, 0, 3); // 注意:src[1], src[2], src[3] -
向目标数组偏移位置写入(如拼接场景):
System.arraycopy(src, 0, dest, 5, src.length); // 从 dest[5] 开始放
三、避坑要点:类型、空值与运行时异常
这个方法不做类型自动转换,也不容忍 null:
立即学习“Java免费学习笔记(深入)”;
- 源数组和目标数组必须是**兼容类型**:比如
String[]可拷入Object[],但不能拷入Integer[] - 目标数组必须已初始化,不能是
null;源数组也不能是null - 所有越界情况(如
srcPos + length > src.length)都会立即抛ArrayIndexOutOfBoundsException - 如果目标数组是基本类型(如
int[]),源数组也必须是同类型,不可用Integer[]
四、对比其他拷贝方式:为什么它最快?
它本质是内存块级拷贝(类似 C 的 memcpy),JVM 对其做了深度优化:
- 比 for 循环快 2–5 倍:无字节码循环开销,无每次访问的数组边界检查(HotSpot 在特定条件下可消除)
-
比 Arrays.copyOf 快一点:因为后者内部其实就调用了
System.arraycopy,但多了一次新数组分配逻辑 - 比 clone() 稍灵活:clone 只能全量浅拷贝,且要求数组类型明确;arraycopy 支持任意段、任意偏移、跨数组操作


















