深拷贝与浅拷贝的解释

本文通过Java代码示例,详细解释了浅拷贝和深拷贝的概念,展示了它们在对象复制时的区别,以及在实际开发中如何根据需求选择使用。
摘要由CSDN通过智能技术生成

深拷贝和浅拷贝是关于对象复制的两个概念。它们描述了在复制对象时,复制的是对象本身还是对象的引用。

  • 浅拷贝是指在复制对象时,仅复制对象本身,而不复制对象引用的内容。也就是说,新对象和原对象共享相同的引用,修改其中一个对象的内容会影响到另一个对象。
  • 深拷贝是指在复制对象时,不仅复制对象本身,还复制对象引用的内容。也就是说,新对象和原对象拥有各自独立的引用和内容,修改一个对象的内容不会影响到另一个对象。
    下面通过一个示例来说明浅拷贝和深拷贝的区别:
import java.util.ArrayList;
import java.util.List;

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> originalList = new ArrayList<>();
        originalList.add(new Person("Alice"));
        originalList.add(new Person("Bob"));

        // 浅拷贝
        List<Person> shallowCopyList = new ArrayList<>(originalList);

        // 深拷贝
        List<Person> deepCopyList = new ArrayList<>();
        for (Person person : originalList) {
            deepCopyList.add(new Person(person.getName()));
        }

        // 修改原始对象的内容
        originalList.get(0).setName("Charlie");

        // 输出结果
        System.out.println("Original List: " + originalList.get(0).getName() + ", " + originalList.get(1).getName());
        System.out.println("Shallow Copy List: " + shallowCopyList.get(0).getName() + ", " + shallowCopyList.get(1).getName());
        System.out.println("Deep Copy List: " + deepCopyList.get(0).getName() + ", " + deepCopyList.get(1).getName());
    }
}

在这个示例中,我们创建了一个 Person 类,其中包含一个 name 属性。然后,我们创建了一个原始的 Person 对象列表 originalList,并将其复制到两个新的列表 shallowCopyList(浅拷贝)和 deepCopyList(深拷贝)中。
接下来,我们修改原始列表中的第一个 Person 对象的 name 属性为 “Charlie”。然后,我们分别输出三个列表中第一个 Person 对象的 name 属性。

输出结果如下:

Original List: Charlie, Bob
Shallow Copy List: Charlie, Bob
Deep Copy List: Alice, Bob

可以看到,浅拷贝的列表和原始列表共享相同的对象引用,因此修改一个对象的内容会影响到另一个对象。而深拷贝的列表则是完全独立的,修改一个对象的内容不会影响到其他对象。

在实际开发中,选择浅拷贝还是深拷贝取决于具体的需求。如果你需要复制的对象是不可变的,或者你希望复制的对象和原始对象共享相同的引用,那么浅拷贝可能是一个更好的选择。如果你希望复制的对象是独立的,修改一个对象的内容不会影响到其他对象,那么深拷贝可能更适合。

深拷贝与浅拷贝适用于任何对象或数据类型,深拷贝常用于对象、List、Map等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值