Java基础篇--浅拷贝和深拷贝

概念 

浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是在对象复制过程中常用的概念。

  • 浅拷贝是指创建一个新对象,并将原始对象的非静态字段的值拷贝到新对象中。如果字段是基本数据类型,直接复制其值;如果字段是引用类型,复制的是引用而不是对象本身。因此,在浅拷贝中,新旧对象共享引用类型字段所指向的对象。
  • 深拷贝是指创建一个新对象,并将原始对象的所有字段的值拷贝到新对象中,包括引用类型字段所指向的对象。通过深拷贝,可以实现两个独立的对象,彼此之间没有任何关联。修改其中一个对象的字段值不会影响另一个对象的字段值。

选择使用浅拷贝还是深拷贝取决于实际需求。如果希望复制对象后的修改不会影响原始对象,应该使用深拷贝;如果可以接受复制对象的修改影响原始对象,或者对象较大且复制性能要求高,则可以使用浅拷贝。

综上所述:

  1. 浅拷贝:

    • 对于简单对象(如基本数据类型),直接复制其值。
    • 对于引用类型字段,复制其引用而不是对象本身。

    结果是,原始对象和复制对象之间共享相同的引用,对原始对象的修改会影响到复制对象,但是对于引用类型字段指向的对象本身的修改则不会影响。

  2. 深拷贝:

    • 对于简单对象和引用类型字段,分别递归地创建它们的独立副本,保证复制对象与原始对象完全独立。

    结果是,原始对象和复制对象之间没有任何引用关系,彼此独立存在,修改其中一个对象不会影响另一个对象。

可以这么理解,从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]
 }
}

猜你喜欢

转载自blog.csdn.net/m0_74293254/article/details/132266261