System.arraycopy 通常比 clone() 更快,尤其在大数组或需部分拷贝时;它为 JVM 内置本地方法,支持任意区间拷贝、无对象创建开销且适用于所有一维数组类型,而 clone() 虽简洁但受限于类型、多维需递归且底层常调用 arraycopy。

System.arraycopy 通常比 clone() 更快,尤其在大数组或需要部分拷贝时;clone() 简洁但受限于类型和可变性,且底层可能仍调用 System.arraycopy。
System.arraycopy 的优势场景
它是 JVM 内置的本地方法,直接操作内存,无对象创建开销,支持任意起始/结束位置的高效拷贝:
- 拷贝大数组(如 > 1024 元素)时,性能优势明显,避免了额外的边界检查和循环开销
- 只需拷贝子区间(例如从索引 100 到 500),无需先创建完整新数组再截取
- 适用于所有一维数组类型(包括基本类型和引用类型),不依赖类是否实现 Cloneable
clone() 的使用限制与隐含成本
数组的 clone() 方法虽语法简洁,但有几处关键约束:
- 仅对一维数组深度拷贝(值类型复制值,引用类型复制引用),多维数组需手动递归 clone
- 必须确保数组所属类可访问 clone()(实际所有数组类都继承自 Object 并重写了 clone,但语义上仍受 protected 修饰符影响)
- 底层多数 JDK 实现中,数组 clone() 内部正是调用 System.arraycopy,因此多一层方法调用跳转,微小开销
实测建议与写法选择
不必为微小差异过度优化,但明确场景可提升代码效率和可读性:
- 已知源/目标数组存在且长度匹配 → 优先用 System.arraycopy,尤其涉及偏移量或复用缓冲区时
- 快速生成同类型、等长副本,且逻辑清晰优先 → clone() 更直观,如 int[] copy = arr.clone();
- 避免在循环内反复 new 数组再 clone,应复用目标数组并用 System.arraycopy 填充
不复杂但容易忽略:真正影响性能的往往不是拷贝方法本身,而是是否触发 GC(如频繁分配)、内存局部性(连续拷贝 vs 随机访问),以及是否真的需要拷贝——有时用视图或不可变封装更优。


















