深拷贝和浅拷贝

85 阅读1分钟

浅拷贝

基本类型

拷贝的就是基本类型的值

引用类型

拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象

如何实现

  1. 实现 Cloneable 接口,标识这个类对象是可以被拷贝的;
  2. 重写 clone() 方法,在 clone 方法里捕获异常;

代码示例

public class CopyTest {

    public static void main(String[] args) {
        Person p1 = new Person("张三", 2, new Car(120));
        Person p2;
        
        //浅拷贝
        p2 = p1.clone();
    }

}

class Person implements Cloneable {
    private String name;
    private int age;

    // 省略对应的构造函数,getter和setter方法
    @Override
    protected Person clone() {
        Person person = null;
        
        try {
            person = (Person) (super.clone());
        } catch (CloneNotSupportedException e) {
           
        }
        
        return person;
    }
}

深拷贝

基本类型

拷贝的就是基本类型的值

引用类型

深拷贝会新建一个对象空间,然后拷贝里面的内容,所以它们指向了不同的内存空间。改变其中一个,不会对另外一个也产生影响。

如何实现

  1. Apache Commons Lang 3 库中的 SerializationUtils 类;
  2. Google Guava 库中的 Copier 类;

代码示例

import org.apache.commons.lang3.SerializationUtils;

public class DeepCopyExample {
    public static void main(String[] args) {
        // 创建要深拷贝的对象
        Person person = new Person("张三", 25);

        // 执行深拷贝
        Person copiedPerson = SerializationUtils.deepCopy(person);

        // 更改原始对象的姓名
        person.setName("李四");

        // 打印原始对象和拷贝对象的姓名
        System.out.println("原始对象的姓名:" + person.getName());
        System.out.println("拷贝对象的姓名:" + copiedPerson.getName());
    }

    // 定义 Person 类,包含姓名和年龄两个属性
    static class Person {
        private String name;
        private int age;

        // 省略对应的构造函数,getter和setter方法
    }
}