深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在对象复制过程中的两种不同方式。

浅拷贝是对对象进行逐位的复制,包括复制对象本身和对象内部的引用。复制后的对象和原始对象共享相同的内存地址,因此对其中一个对象的修改会影响到另一个对象。

深拷贝是对对象进行递归复制,不仅复制对象本身,还会复制对象内部的所有引用的对象。复制后的对象和原始对象拥有独立的内存地址,彼此之间互不影响。

下面是对浅拷贝和深拷贝的示例说明:

import java.util.ArrayList;
import java.util.List;

class Person {
    private String name;
    private List<String> hobbies;

    public Person(String name, List<String> hobbies) {
        this.name = name;
        this.hobbies = hobbies;
    }

    public String getName() {
        return name;
    }

    public List<String> getHobbies() {
        return hobbies;
    }
}

public class DeepCopyShallowCopyExample {
    public static void main(String[] args) {
        List<String> hobbies = new ArrayList<>();
        hobbies.add('reading');
        hobbies.add('cooking');

        Person person1 = new Person('John', hobbies);

        // 浅拷贝
        Person person2 = new Person(person1.getName(), person1.getHobbies());

        // 修改 person1 的属性
        person1.getName(); // 'John'
        person1.getHobbies().add('writing');

        // 输出 person2 的属性
        System.out.println(person2.getName()); // 'John'
        System.out.println(person2.getHobbies()); // ['reading', 'cooking', 'writing']

        // 深拷贝
        List<String> hobbiesCopy = new ArrayList<>(person1.getHobbies());
        Person person3 = new Person(person1.getName(), hobbiesCopy);

        // 修改 person1 的属性
        person1.getName(); // 'John'
        person1.getHobbies().add('swimming');

        // 输出 person3 的属性
        System.out.println(person3.getName()); // 'John'
        System.out.println(person3.getHobbies()); // ['reading', 'cooking']
    }
}

在上述示例中,我们定义了一个 Person 类,包含一个姓名属性和一个爱好列表。通过使用不同的拷贝方式,展示了浅拷贝和深拷贝的区别。

对于浅拷贝,我们创建了一个新的 Person 对象 person2,将原始 person1 的属性逐一复制给 person2。当我们修改 person1 的爱好列表时,会同时影响到 person2,因为它们共享相同的引用。

对于深拷贝,我们通过创建一个新的爱好列表 hobbiesCopy 来拷贝 person1 的爱好列表。这样,当我们修改 person1 的爱好列表时,不会对 person3 产生影响。

总结起来,浅拷贝仅复制对象本身和对象内部的引用,而深拷贝会递归地复制对象及其内部引用的对象。深拷贝得到的对象是独立的,任何改动都不会影响到原始对象。

浅拷贝 vs 深拷贝:Java 代码示例讲解

原文地址: https://www.cveoy.top/t/topic/jM0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录