java数组拷贝本质是内存迁移,system.arraycopy()为jvm原生实现、高效安全;clone()等价于arraycopy但限一维;for循环最慢但灵活;所有方式均为浅拷贝。

Java 数组拷贝方法的内部执行流,本质是数据从源内存区域到目标内存区域的迁移过程。不同方法底层机制差异明显,直接影响性能、安全性和适用场景。
System.arraycopy():JVM 层面的原生内存搬运
这是唯一真正实现“内存级拷贝”的方式。它不经过 Java 字节码解释器,而是直接调用 JVM 底层的 native 实现(通常由 C/C++ 编写),绕过对象创建和边界检查开销。
- 执行时先校验参数合法性(如数组非 null、索引不越界、length ≥ 0)
- 若源/目标为同一数组,会按方向自动处理重叠区域(如 srcPos
- 最终调用类似 memcpy 或 memmove 的系统级内存操作,批量复制连续字节
- 对基本类型数组,就是纯粹的字节搬移;对引用类型数组,搬移的是对象引用地址(即浅拷贝)
Arrays.copyOf():封装了 arraycopy 的便捷接口
它本身不执行拷贝逻辑,而是构造新数组后委托给 System.arraycopy() 完成实际工作。
- 第一步:根据 newLength 创建新数组(可能扩容或截断)
- 第二步:调用 System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength))
- 第三步:若 newLength > original.length,剩余位置用默认值填充(如 int 为 0,Object 为 null)
- 因此它的执行流 = 分配内存 + 原生拷贝 +(可选)默认值填充
clone():Object 类定义的轻量级复制协议
数组类继承自 Object,其 clone() 方法被 JVM 特殊优化,行为等价于一次 System.arraycopy() 调用。
- 执行时直接分配同类型、同长度的新数组空间
- 内部隐式调用 System.arraycopy(this, 0, 新数组, 0, length)
- 不触发任何构造方法,也不走普通 Java 方法调用栈,效率接近 arraycopy
- 但仅支持一维数组,且无法指定起始/偏移位置
for 循环:纯 Java 字节码逐元素赋值
这是最透明但最慢的方式,完全依赖 JVM 解释执行或 JIT 编译后的指令序列。
- 每次循环迭代都包含:读取 src[i] → 写入 dest[i] → i++ → 条件判断
- 涉及多次数组边界检查(每次访问都触发 checkarraybounds)
- 无法利用 CPU 的 SIMD 指令或缓存预取优化,吞吐量受限于单次内存读写带宽
- 优势在于可嵌入业务逻辑(如转换、过滤、空值处理),但纯拷贝毫无必要
不复杂但容易忽略:所有标准拷贝方式对引用类型数组都只复制引用,不递归复制对象本身。真要深拷贝,必须手动遍历并调用每个元素的 clone() 或构造新实例。











