system.arraycopy 和 clone() 均实现一维数组浅拷贝,但前者是静态本地方法、需预分配目标数组、支持偏移拷贝且性能更高;后者是实例方法、自动创建新数组、语义简洁但灵活性低、多维数组仅浅拷贝引用。

System.arraycopy 和数组的 clone() 方法都能完成一维数组的浅拷贝,但它们在设计目标、使用方式、性能表现和适用范围上有本质区别。
功能定位不同
System.arraycopy 是一个静态工具方法,作用是“把一段内存从源位置复制到目标位置”,不创建新数组,只填充已有数组;clone() 是实例方法,作用是“生成一个同类型、等长度的新数组并完成拷贝”,会分配新对象。
- arraycopy 必须传入已存在的目标数组,适合复用缓冲区或分段拷贝
- clone() 一行代码返回新数组,语义清晰,适合快速获得副本
- clone() 对多维数组也有效(但只是浅拷贝各子数组引用),而 arraycopy 只支持一维
性能差异明显
System.arraycopy 是 JVM 内置的本地方法(native),直接操作内存,无额外方法调用开销;clone() 在多数 JDK 实现中底层仍调用 arraycopy,但多了一层 Java 方法跳转和类型检查。
- 大数组(如 >1024 元素)拷贝时,arraycopy 通常快 9–10 倍
- 需拷贝子区间(如索引 50 到 150)时,只有 arraycopy 支持指定起始偏移,clone() 只能全量拷贝
- 频繁在循环中 new 数组再 clone,容易触发 GC;复用目标数组 + arraycopy 更省内存
类型与安全性约束不同
arraycopy 是泛型友好的底层操作,对所有一维数组类型(int[]、String[]、Object[] 等)都适用,且无需关心类是否实现 Cloneable;clone() 虽然所有数组类都重写了该方法,但语法上受 protected 修饰符限制,必须通过实例调用,且不能用于泛型数组(如 T[])直接调用(编译不通过)。
- arraycopy 不做运行时类型强校验,若 src 和 dest 类型不兼容(如 int[] → String[]),会在执行时抛出 ArrayStoreException
- clone() 调用前无需预分配目标数组,但无法控制拷贝起点/终点,灵活性低
- 二者都是浅拷贝:基本类型值被复制,引用类型只复制引用地址
实际写法建议
不需要纠结“哪个绝对更好”,而是按场景选:
- 要复用已有数组、做偏移拷贝、或在高性能路径(如 IO 缓冲、排序中间步骤)中使用 → 选 System.arraycopy
- 只需快速得到一份同类型等长副本,逻辑简洁优先 → 用 arr.clone()
- 需要深拷贝对象数组 → 二者都不行,得遍历调用每个元素的 clone() 或序列化
- 用 Arrays.copyOf?它本质就是先 new 数组 + System.arraycopy,适合扩容场景











