System.arraycopy是Java中数组拷贝最高效的方式,因其为JVM内置native操作,绕过方法栈开销,实测比for循环快2–5倍,且支持精确控制源/目标起始索引与长度。

Java 中数组拷贝最高效的方式之一就是 System.arraycopy,它由 JVM 底层直接支持,比手动循环或 Arrays.copyOf 更轻量、更快,尤其适合大批量元素的块拷贝。
为什么优先选 System.arraycopy?
它不是 Java 方法调用,而是 JVM 内置的本地操作(native),绕过方法栈开销和边界检查(运行时仍会校验,但优化充分)。实测在百万级数组拷贝中,性能通常比 for 循环快 2–5 倍,也比 Arrays.copyOf(内部其实也调用它)更灵活——你能精确控制源起点、目标起点和拷贝长度。
基本语法与参数含义
调用形式固定:
-
源数组:不能为 null,否则抛
NullPointerException - 源起始索引:从源数组哪个位置开始读(含),必须 ≥ 0 且 ≤ 源数组长度
- 目标数组:不能为 null,且类型需与源数组兼容(如 int[] → int[],String[] → Object[] 可行)
- 目标起始索引:往目标数组哪个位置写入(含),同样需满足 0 ≤ 索引 ≤ 目标数组长度
-
拷贝长度:要复制多少个元素,必须 ≥ 0;若过大(超出源或目标剩余空间),抛
ArrayStoreException或IndexOutOfBoundsException
常用实战场景示例
以下代码均假设已定义:int[] src = {1, 2, 3, 4, 5}; int[] dst = new int[8];
立即学习“Java免费学习笔记(深入)”;
-
整体复制到新数组开头:
System.arraycopy(src, 0, dst, 0, src.length);→ dst = [1,2,3,4,5,0,0,0] -
跳过前两个元素复制剩余部分:
System.arraycopy(src, 2, dst, 1, 3);→ 从 src[2] 开始拷 3 个 → dst[1]~dst[3] = [3,4,5] -
数组内移动(向右平移):
System.arraycopy(src, 0, src, 1, 4);→ 把前 4 个元素移到下一位,src 变成 [1,1,2,3,4](注意:同数组拷贝时,方向很重要,反向移动需用负步长逻辑,但 arraycopy 不支持,此时应倒序调用) -
扩容并保留原内容(模拟 ArrayList.ensureCapacity):
int[] newArr = new int[src.length * 2]; System.arraycopy(src, 0, newArr, 0, src.length);
易错点与避坑提醒
- 目标数组类型不匹配会抛
ArrayStoreException,例如把String[]拷进Integer[] - 源/目标为同一数组时,若源起始
- 不要传错长度参数——写成
dst.length而非src.length可能越界;建议始终用Math.min(src.length - srcPos, dst.length - dstPos)做安全截断 - 它不创建新数组,只复制元素值;对引用类型,复制的是引用地址,不是对象本身(即浅拷贝)


















