1. 浅拷贝
-
什么是浅拷贝:浅拷贝会创建一个新对象,但如果对象中有引用类型(比如数组、对象等),浅拷贝只会复制引用(地址),而不会复制引用指向的实际内容。
-
对于基本数据类型数组:
-
基本数据类型(如
int
、double
等)是值传递的,所以浅拷贝会复制实际的值。 -
修改拷贝数组的元素不会影响原数组。
-
-
对于引用数据类型数组:
-
引用数据类型(如对象、数组等)是引用传递的,浅拷贝只会复制引用地址。
-
修改拷贝数组的元素会影响原数组,因为它们指向同一个对象。
-
2. 深拷贝
-
什么是深拷贝:深拷贝会递归复制对象中的所有内容,包括引用类型指向的实际内容。
-
无论数组中的元素是基本数据类型还是引用数据类型,深拷贝都会创建一个完全独立的新对象。
修正后的例子
例子 1:基本数据类型数组(浅拷贝)
java
Copy
int[] original = {1, 2, 3}; int[] copy = original.clone(); // 浅拷贝 copy[0] = 100; // 修改拷贝数组的第一个元素 System.out.println(original[0]); // 输出 1(原数组不受影响)
-
解释:
-
对于基本数据类型数组,
clone()
是值拷贝,所以修改copy
不会影响original
。 -
输出
1
,因为原数组没有变化。
-
例子 2:引用数据类型数组(浅拷贝)
java
Copy
class Person {String name;Person(String name) {this.name = name;} }public class Main {public static void main(String[] args) {Person[] original = {new Person("Alice"), new Person("Bob")};Person[] copy = original.clone(); // 浅拷贝copy[0].name = "Charlie"; // 修改拷贝数组的第一个元素的属性System.out.println(original[0].name); // 输出 Charlie(原数组受影响)} }
-
解释:
-
对于引用数据类型数组,
clone()
是引用拷贝,copy
和original
共享相同的对象。 -
修改
copy[0]
的属性会影响original[0]
,因为它们指向同一个对象。 -
输出
Charlie
,因为原数组被修改了。
-
例子 3:引用数据类型数组(深拷贝)
java
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();}copy[0].name = "Charlie"; // 修改拷贝数组的第一个元素的属性System.out.println(original[0].name); // 输出 Alice(原数组不受影响)} }
-
解释:
-
深拷贝会递归复制对象,
copy
和original
是完全独立的。 -
修改
copy[0]
的属性不会影响original[0]
。 -
输出
Alice
,因为原数组没有被修改。
-
总结
-
浅拷贝:
-
对于基本数据类型数组,是值拷贝,修改拷贝数组不会影响原数组。
-
对于引用数据类型数组,是引用拷贝,修改拷贝数组会影响原数组。
-
-
深拷贝:
-
无论是基本数据类型数组还是引用数据类型数组,都会创建一个完全独立的新对象,修改拷贝数组不会影响原数组。
-