System.arraycopy 是 Java 中最高效的数组复制方式,因其直接调用 JVM 底层内存搬运指令,大批量时比 for 循环快 2–5 倍,但需严格校验参数、类型兼容性及长度阈值(基本类型建议 ≥256),且目标数组须预先分配。

System.arraycopy 是 Java 中最高效的数组元素复制方式,因为它跳过 Java 层循环和逐元素检查,直接调用 JVM 底层内存搬运指令(如 memmove 或 SIMD 向量化指令),实测在大批量数据下比 for 循环快 2–5 倍。
参数必须严格对齐,否则立刻抛异常
调用格式固定:System.arraycopy(src, srcPos, dest, destPos, length)。五个参数一个都不能错:
- src 和 dest 都不能为 null,否则抛 NullPointerException
- srcPos ≥ 0 且 srcPos + length ≤ src.length;destPos ≥ 0 且 destPos + length ≤ dest.length,越界直接抛 ArrayIndexOutOfBoundsException
- length 可以为 0(合法空操作,常用于边界预检)
- 类型必须兼容:int[] 只能拷到 int[];String[] 可拷到 Object[],但反过来或跨基本类型(如 int[] → long[])会抛 ArrayStoreException
大批量才真正快,小数组反而拖慢
性能优势有明确门槛:
- 基本类型数组(byte[]、int[] 等)建议 length ≥ 256,JVM 才大概率启用 SIMD 指令加速
- length ≤ 16 时,JNI 调用开销可能高于简单 for 循环,此时直接赋值更合适
- 对象数组(如 String[])虽不享受地址对齐加速,但只复制引用、不触发 GC 写屏障,高吞吐场景仍明显快于手动循环
- 避免用 Arrays.asList().toArray() 等泛型中转,类型擦除会破坏 JIT 内联,退化为普通循环
原地移动不用自己判断方向
同一数组内移位(如 ArrayList 删除元素后前移、RingBuffer 左移)时,JVM 自动根据 srcPos 和 destPos 关系选择正向或倒序搬运,防止覆盖:
立即学习“Java免费学习笔记(深入)”;
- 左移(destPos
- 右移(destPos > srcPos):例如 System.arraycopy(arr, 2, arr, 5, 5),JVM 倒序执行,避免 arr[2] 覆盖 arr[3] 后丢失原值
- 必须保证重叠区间合法:srcPos + length ≤ arr.length 且 destPos + length ≤ arr.length
目标数组必须提前分配好
arraycopy 不创建新数组,只搬运数据。所有“复制效果”依赖你已准备好目标容器:
- 完整复制:int[] newArr = new int[src.length]; System.arraycopy(src, 0, newArr, 0, src.length)
- 截取子数组:new int[to - from],再 System.arraycopy(src, from, dest, 0, to - from)
- 拼接两个数组:new int[a.length + b.length],分两步拷贝——先 a,再 b(起始位置设为 a.length)
- 物理备份:如从 packet[1..3] 搬到 backup[3..5],直接 System.arraycopy(packet, 1, backup, 3, 3)


















