Java数组拷贝最推荐Arrays.copyOf()和System.arraycopy(),前者语义清晰、安全高效,适合新建数组;后者性能更优、控制精细,适用于已有数组覆盖写入;二者均为浅拷贝,对象数组需手动深拷贝。

Java中数组拷贝最常用、最推荐的方式是使用Arrays.copyOf()和System.arraycopy(),它们比手动循环更高效、更安全,且语义清晰。
用 Arrays.copyOf() 快速复制整个或部分数组
这个方法适合大多数场景,尤其适合需要新数组对象、并指定长度的情况。它内部调用System.arraycopy(),封装友好,不易出错。
- 复制全部元素:
int[] copy = Arrays.copyOf(original, original.length); - 复制前5个元素(若原数组长度不足5,则补0):
int[] head = Arrays.copyOf(arr, 5); - 复制从索引2开始的3个元素:
int[] sub = Arrays.copyOfRange(arr, 2, 5);(注意:右边界为开区间)
用 System.arraycopy() 实现高性能、可控的底层拷贝
当需要精确控制源/目标位置、避免创建新数组、或在已有数组上覆盖写入时,该方法更灵活,性能也略优(无额外对象创建开销)。
- 语法:
System.arraycopy(src, srcPos, dest, destPos, length) - 要求
dest必须已初始化且足够大;src和dest可以是同一数组(实现移动或翻转) - 示例:把
arr[1]到arr[3]拷贝到buf[0]开始的位置:System.arraycopy(arr, 1, buf, 0, 3);
避开常见陷阱:浅拷贝与引用类型数组
无论哪种方式,Java数组拷贝都是浅拷贝——只复制元素的值。对基本类型没问题;但对对象数组,复制的是引用,不是对象本身。
立即学习“Java免费学习笔记(深入)”;
- 例如:
String[] a = {"hello"}; String[] b = Arrays.copyOf(a, 1);→a[0]和b[0]指向同一个String对象 - 如需深拷贝对象数组,需手动遍历并调用每个对象的克隆方法或构造新实例
- 多维数组同理:
int[][]拷贝后,外层数组是新的,但内层数组引用未变
不推荐的手动循环和错误做法
虽然能用for循环逐个赋值,但易出边界异常、代码冗长,且JVM无法对其做优化。另外,直接赋值int[] b = a;只是引用复制,两个变量指向同一块内存,修改会相互影响。
- 避免:
int[] b = a;(这不是拷贝,是别名) - 避免:
for (int i = 0; i (除非有特殊逻辑,否则没必要) - 避免对
null数组调用拷贝方法而不校验(Arrays.copyOf(null, 1)抛NullPointerException)


















