system.arraycopy 比 for 循环快,因其是 jvm 内置 native 方法,绕过 java 层循环控制、逐元素边界检查与类型校验,直接调用底层内存块拷贝指令(如 memcpy),仅复制引用且缓存友好;但要求目标数组预先分配、类型兼容,不支持深拷贝。

System.arraycopy 是 Java 中复制数组最高效的方式之一,尤其适用于对象数组。它由 JVM 底层直接支持,绕过 Java 层的循环和边界检查,性能远超手动 for 循环或 Arrays.copyOf。
为什么 arraycopy 比 for 循环快?
它不是 Java 方法,而是 JVM 内置的本地实现(native),底层通常调用内存块拷贝指令(如 memcpy)。对对象数组而言,它只复制引用(即地址值),不触发构造、克隆或深拷贝逻辑,因此开销极小。
- 不创建新对象,仅复制引用指针
- 无逐个元素的 null 判断或类型校验(前提是类型兼容)
- 一次完成连续内存区域的搬运,缓存友好
基本用法与参数含义
签名:System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
- src:源数组(非 null)
- srcPos:从源数组第几个索引开始复制(从 0 起)
- dest:目标数组(必须已初始化,长度足够)
- destPos:复制到目标数组的起始索引
- length:要复制的元素个数(不能超出源或目标可用范围)
例如:System.arraycopy(src, 0, dest, 0, src.length); 完成完整复制。
常见陷阱与注意事项
虽高效,但易出错,需严格校验:
- 目标数组必须预先分配好空间,否则抛
NullPointerException或ArrayStoreException - 若 src 和 dest 是同一数组,需注意重叠区域——arraycopy 支持自复制(如数组内移动),但方向由参数决定
- 运行时类型必须兼容:若 dest 是 String[],src 不能是 Object[](除非实际元素全为 String)
- 不处理深拷贝:对象本身不会被复制,仅引用被复制,修改原对象仍会影响副本中的引用
对比 Arrays.copyOf 的适用场景
Arrays.copyOf 内部其实就调用了 arraycopy,但它会自动新建数组,适合“扩容”或“截取”场景;而 arraycopy 更适合已有目标数组、需精确控制位置和长度的情况。
- 需要复用已有数组缓冲区 → 用 arraycopy
- 只需简单复制并返回新数组 → Arrays.copyOf 更简洁
- 在循环中高频复制片段(如分块处理)→ arraycopy 避免反复 new 数组,更省内存和 GC 压力











