System.arraycopy 是 Java 中基于 JVM 本地实现的高效数组拷贝方法,支持任意类型数组,需确保非空、类型兼容及索引合法;其五参数调用格式为 System.arraycopy(src, srcPos, dest, destPos, length),性能优于 Arrays.copyOf 和手动循环。

System.arraycopy 是 Java 中高效、底层的数组拷贝方法,它直接调用 JVM 的本地实现(通常由 C/C++ 编写),性能远超手动循环或 Arrays.copyOf(后者内部其实也调用了 arraycopy)。它支持任意类型数组(包括基本类型和对象引用),但不支持泛型数组的类型安全检查,使用时需确保类型兼容、边界合法。
核心用法:五个参数含义必须清楚
调用格式为:System.arraycopy(src, srcPos, dest, destPos, length);
- src:源数组(不能为空)
- srcPos:源数组起始索引(从 0 开始,必须 ≥ 0 且 ≤ src.length)
- dest:目标数组(不能为空,且类型必须与 src 兼容)
- destPos:目标数组起始索引(≥ 0 且 ≤ dest.length)
-
length:要拷贝的元素个数(≥ 0;若过大,会抛
ArrayIndexOutOfBoundsException)
常见拷贝场景示例
✅ 完整拷贝(等长数组)int[] a = {1, 2, 3}; int[] b = new int[3]; System.arraycopy(a, 0, b, 0, a.length);
✅ 部分拷贝(截取前 2 个)char[] src = {'a','b','c','d'}; char[] dst = new char[2]; System.arraycopy(src, 0, dst, 0, 2); // dst = ['a','b']
✅ 向后偏移拷贝(实现数组扩容/插入效果)String[] arr = {"x", "y"}; String[] newArr = new String[4]; System.arraycopy(arr, 0, newArr, 1, arr.length); // newArr = [null,"x","y",null]
必须避开的典型错误
- 源或目标数组为
null→ 抛NullPointerException - 任一索引越界(如
srcPos > src.length)→ 抛ArrayIndexOutOfBoundsException - 拷贝长度为负数 → 抛
ArrayIndexOutOfBoundsException - 目标数组类型不兼容(如把
String[]拷到Integer[])→ 抛ArrayStoreException - 对基本类型数组和引用类型数组混用(如
int[]→Object[])→ 编译失败或运行异常
对比 Arrays.copyOf 和手动循环
Arrays.copyOf(arr, newLength) 实质是先新建数组,再调用 arraycopy;而 arraycopy 本身不分配内存,只做复制——因此在已有目标数组、只需填充数据时更轻量。
手动 for 循环可读性强,但涉及边界判断、类型转换、JVM 优化限制,性能通常不如 arraycopy,尤其在大数据量时差异明显。


















