在Java编程中,数组复制是日常开发里非常常见的操作,不同的复制方式在实现逻辑、性能表现和适用场景上都有明显差异,开发者需要根据实际需求选择最合适的方式。数组复制分为浅复制和深复制,本文介绍的常规数组复制方式均为浅复制,对于引用类型数组仅复制引用地址。

一、手动遍历复制数组
手动遍历复制是最基础的数组复制方式,通过循环遍历原数组的每个元素,逐个赋值到新数组中,这种方式逻辑简单,容易理解,适合新手入门使用。
实现步骤如下:
- 创建一个新的数组,长度与原数组一致
- 使用for循环或者增强for循环遍历原数组
- 将每个元素赋值到新数组的对应位置
以下是手动遍历复制int类型数组的代码示例:
public class ArrayCopyDemo {
public static void main(String[] args) {
int[] originalArray = {1, 2, 3, 4, 5};
// 创建长度相同的新数组
int[] newArray = new int[originalArray.length];
// 遍历赋值
for (int i = 0; i < originalArray.length; i++) {
newArray[i] = originalArray[i];
}
// 验证复制结果
for (int num : newArray) {
System.out.println(num);
}
}
}
二、使用clone方法复制数组
Java中所有的数组都继承自Object类,因此都拥有clone方法,该方法可以快速复制数组,返回的是一个新的数组对象,对于基本类型数组是值复制,对于引用类型数组是引用复制。
clone方法的使用非常简单,直接调用原数组的clone方法即可,不需要额外导入其他类,代码简洁度高。
以下是使用clone方法复制数组的示例:
public class ArrayCloneDemo {
public static void main(String[] args) {
String[] originalStrArray = {"Java", "Python", "C++"};
// 调用clone方法复制数组
String[] clonedArray = originalStrArray.clone();
// 修改原数组元素,验证克隆数组是否受影响
originalStrArray[0] = "Go";
System.out.println("原数组第一个元素:" + originalStrArray[0]);
System.out.println("克隆数组第一个元素:" + clonedArray[0]);
}
}
三、使用Arrays.copyOf方法复制数组
Arrays类是Java提供的用于操作数组的工具类,其中的copyOf方法可以方便地复制数组,还可以指定新数组的长度,如果新长度比原数组长,多余的位置会用数组类型的默认值填充。
copyOf方法有两个参数,第一个是原数组,第二个是新数组的长度,返回值是复制后的新数组。
以下是使用Arrays.copyOf方法复制数组的示例:
import java.util.Arrays;
public class ArraysCopyOfDemo {
public static void main(String[] args) {
int[] originalArray = {10, 20, 30};
// 复制长度与原数组一致
int[] copyArray1 = Arrays.copyOf(originalArray, originalArray.length);
// 复制长度比原数组长,多余位置用0填充
int[] copyArray2 = Arrays.copyOf(originalArray, 5);
System.out.println("copyArray1长度:" + copyArray1.length);
System.out.println("copyArray2长度:" + copyArray2.length);
System.out.println("copyArray2第四个元素:" + copyArray2[3]);
}
}
四、使用System.arraycopy方法复制数组
System.arraycopy是Java提供的底层数组复制方法,native修饰说明它是本地方法,性能通常比前几种方式更好,适合需要高性能复制的场景。
该方法有五个参数,分别是原数组、原数组起始位置、目标数组、目标数组起始位置、复制长度,使用时需要提前创建好目标数组,且目标数组长度要足够容纳复制的内容。
以下是System.arraycopy的使用示例:
public class SystemArraycopyDemo {
public static void main(String[] args) {
int[] srcArray = {1, 2, 3, 4, 5};
int[] destArray = new int[3];
// 从原数组索引1开始,复制3个元素到目标数组的起始位置
System.arraycopy(srcArray, 1, destArray, 0, 3);
for (int num : destArray) {
System.out.println(num);
}
}
}
五、不同复制方式对比
为了帮助开发者选择合适的复制方式,以下是几种常见方式的对比:
| 复制方式 | 性能 | 灵活性 | 使用难度 | 适用场景 |
|---|---|---|---|---|
| 手动遍历复制 | 较低 | 高,可自定义复制逻辑 | 低 | 需要自定义复制逻辑的场景 |
| clone方法 | 中等 | 低,只能完整复制 | 低 | 快速完整复制数组的场景 |
| Arrays.copyOf | 中等 | 中等,可指定新数组长度 | 低 | 需要复制并可能调整数组长度的简单场景 |
| System.arraycopy | 高 | 高,可指定复制的起始位置和长度 | 中等 | 高性能要求、需要部分复制的场景 |
六、注意事项
在使用数组复制时需要注意以下几点:
- 以上介绍的复制方式都是浅复制,如果数组元素是引用类型,复制后新旧数组的对应元素会指向同一个对象,修改对象内容会影响两个数组
- 使用System.arraycopy时,如果复制长度超过原数组或者目标数组的容量,会抛出
IndexOutOfBoundsException异常 - 如果原数组为null,调用clone、Arrays.copyOf、System.arraycopy都会抛出
NullPointerException异常,使用前需要做好非空判断
如果需要实现引用类型数组的深复制,需要遍历数组,对每个引用对象单独创建新实例并赋值,不能仅使用上述浅复制方式。
Java数组复制System_arraycopyArrays_copyOfclone修改时间:2026-06-28 12:09:27