概念
浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是在对象复制过程中常用的概念。
- 浅拷贝是指创建一个新对象,并将原始对象的非静态字段的值拷贝到新对象中。如果字段是基本数据类型,直接复制其值;如果字段是引用类型,复制的是引用而不是对象本身。因此,在浅拷贝中,新旧对象共享引用类型字段所指向的对象。
- 深拷贝是指创建一个新对象,并将原始对象的所有字段的值拷贝到新对象中,包括引用类型字段所指向的对象。通过深拷贝,可以实现两个独立的对象,彼此之间没有任何关联。修改其中一个对象的字段值不会影响另一个对象的字段值。
选择使用浅拷贝还是深拷贝取决于实际需求。如果希望复制对象后的修改不会影响原始对象,应该使用深拷贝;如果可以接受复制对象的修改影响原始对象,或者对象较大且复制性能要求高,则可以使用浅拷贝。
综上所述:
-
浅拷贝:
- 对于简单对象(如基本数据类型),直接复制其值。
- 对于引用类型字段,复制其引用而不是对象本身。
结果是,原始对象和复制对象之间共享相同的引用,对原始对象的修改会影响到复制对象,但是对于引用类型字段指向的对象本身的修改则不会影响。
-
深拷贝:
- 对于简单对象和引用类型字段,分别递归地创建它们的独立副本,保证复制对象与原始对象完全独立。
结果是,原始对象和复制对象之间没有任何引用关系,彼此独立存在,修改其中一个对象不会影响另一个对象。
可以这么理解,从A这里复制出来了一个B,此时我修改了A的对象,而B的对象也跟着改变,这则是浅拷贝。相反,我修改了A的对象,而B的对象不跟着改变,这便是深拷贝。
示例代码:
//创建一个类Person
class Person {
String name;
int age;
// 构造函数
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重写toString方法
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class myclass {
public static void main(String[] args) {
// 创建一个Person对象
Person person1 = new Person("John", 25);
// 浅拷贝示例
Person person2 = person1; // 直接将person1的引用赋值给person2
person2.age = 30; // 修改person2的属性,也会影响到person1
System.out.println("浅拷贝示例:");
System.out.println("person1: " + person1);//运行结果:person1: Person [name=John, age=30]
System.out.println("person2: " + person2);//运行结果:person2: Person [name=John, age=30]
// 深拷贝示例
Person person3 = new Person(person1.name, person1.age); // 创建新的Person对象,将person1的属性值复制给person3
person3.age = 35; // 修改person3的属性,不会影响到person1
System.out.println("深拷贝示例:");
System.out.println("person1: " + person1);//运行结果:person1: Person [name=John, age=30]
System.out.println("person3: " + person3);//运行结果:person3: Person [name=John, age=35]
}
}