在 Java 中,拷贝数组 是指将一个数组的内容复制到另一个数组中。数组拷贝可以分为 浅拷贝 和 深拷贝,具体取决于数组元素的类型(基本数据类型或引用数据类型)。以下是几种常见的数组拷贝方法:
1. 使用 for
循环手动拷贝
这是最基础的方法,通过遍历原数组,将每个元素复制到新数组中。
示例:
Copy
public class Main {public static void main(String[] args) {int[] original = {1, 2, 3, 4, 5};int[] copy = new int[original.length];// 使用 for 循环拷贝数组for (int i = 0; i < original.length; i++) {copy[i] = original[i];}// 打印拷贝后的数组for (int num : copy) {System.out.print(num + " ");}} }
-
输出结果:
Copy
1 2 3 4 5
-
特点:
-
适用于基本数据类型数组和引用数据类型数组。
-
对于引用数据类型数组,拷贝的是引用(浅拷贝)。
-
2. 使用 System.arraycopy()
方法
System.arraycopy()
是 Java 提供的一个高效数组拷贝方法。
语法:
Copy
System.arraycopy(原数组, 原数组起始位置, 目标数组, 目标数组起始位置, 拷贝长度);
示例:
Copy
public class Main {public static void main(String[] args) {int[] original = {1, 2, 3, 4, 5};int[] copy = new int[original.length];// 使用 System.arraycopy 拷贝数组System.arraycopy(original, 0, copy, 0, original.length);// 打印拷贝后的数组for (int num : copy) {System.out.print(num + " ");}} }
-
输出结果:
Copy
1 2 3 4 5
-
特点:
-
高效,底层是 native 方法。
-
适用于基本数据类型数组和引用数据类型数组。
-
对于引用数据类型数组,拷贝的是引用(浅拷贝)。
-
3. 使用 Arrays.copyOf()
方法
Arrays.copyOf()
是 Java 提供的一个简便的数组拷贝方法。
语法:
Copy
目标数组 = Arrays.copyOf(原数组, 新数组长度);
示例:
Copy
import java.util.Arrays;public class Main {public static void main(String[] args) {int[] original = {1, 2, 3, 4, 5};// 使用 Arrays.copyOf 拷贝数组int[] copy = Arrays.copyOf(original, original.length);// 打印拷贝后的数组for (int num : copy) {System.out.print(num + " ");}} }
-
输出结果:
Copy
1 2 3 4 5
-
特点:
-
简洁易用。
-
适用于基本数据类型数组和引用数据类型数组。
-
对于引用数据类型数组,拷贝的是引用(浅拷贝)。
-
4. 使用 clone()
方法
Java 中的数组是对象,因此可以使用 clone()
方法来拷贝数组。
示例:
Copy
public class Main {public static void main(String[] args) {int[] original = {1, 2, 3, 4, 5};// 使用 clone 方法拷贝数组int[] copy = original.clone();// 打印拷贝后的数组for (int num : copy) {System.out.print(num + " ");}} }
-
输出结果:
Copy
1 2 3 4 5
-
特点:
-
简单易用。
-
适用于基本数据类型数组和引用数据类型数组。
-
对于引用数据类型数组,拷贝的是引用(浅拷贝)。
-
5. 深拷贝与浅拷贝
-
浅拷贝:只拷贝数组的引用,新数组和原数组共享相同的元素(适用于基本数据类型数组)。
-
深拷贝:拷贝数组的所有元素,包括引用数据类型数组中的对象(需要手动实现)。
深拷贝示例:
Copy
class Person implements Cloneable {String name;Person(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();} }public class Main {public static void main(String[] args) throws CloneNotSupportedException {Person[] original = {new Person("Alice"), new Person("Bob")};Person[] copy = new Person[original.length];// 深拷贝for (int i = 0; i < original.length; i++) {copy[i] = (Person) original[i].clone();}// 修改原数组中的对象original[0].name = "Charlie";// 打印拷贝后的数组for (Person person : copy) {System.out.println(person.name);}} }
-
输出结果:
Copy
Alice Bob
-
特点:
-
深拷贝后,修改原数组中的对象不会影响新数组。
-
6. 总结
-
浅拷贝:适用于基本数据类型数组,或引用数据类型数组的引用拷贝。
-
深拷贝:适用于引用数据类型数组,需要手动实现。
-
常用方法:
-
for
循环:灵活,适用于所有场景。 -
System.arraycopy()
:高效,推荐使用。 -
Arrays.copyOf()
:简洁易用。 -
clone()
:简单,但需要实现Cloneable
接口。
-