关于java:java浅拷贝和深拷贝的区别的代码实现

31次阅读

共计 1980 个字符,预计需要花费 5 分钟才能阅读完成。

浅拷贝:创立一个新对象,新对象的属性和原来对象完全相同,对于非根本类型属性,仍指向原来对象的属性所指向的对象的内存地址。

深拷贝:创立一个新对象,属性中援用的其余对象也会被克隆,不再指向原有对象地址。
换言之,深拷贝把要复制的对象所援用的对象都复制了一遍

package org.springblade.modules.prototype;

import lombok.Data;
import java.io.*;

/**
 * @author zdx
 * @description
 */

@Data
public class Person implements Cloneable, Serializable {

    private String name;

    private Integer age;

    private Address address;

    @Override
    protected Object clone() throws CloneNotSupportedException {Person person = (Person) super.clone();
        return person;
    }
}
package org.springblade.modules.prototype;

import lombok.Data;
import java.io.Serializable;

/**
 * @author zdx
 * @description
 */

@Data
public class Address {private String name;}
package org.springblade.modules.prototype;

/**
 * @author zdx
 * @description
 */
public class Main {public static void main(String[] args) throws CloneNotSupportedException {Person person = new Person();
        Address address = new Address();
        address.setName("福建省");
        person.setAddress(address);

        Person person1 = (Person) person.clone();
        System.out.println("person == person1=======" + (person == person1));
        System.out.println("person.getAddress() == person1.getAddress()===========" + (person.getAddress() == person1.getAddress()));
    }
}

咱们能够看出 person 和 person1 外面的 address 对象是同一个所以以后是浅拷贝。
接下来咱们通过两种形式来实现深拷贝

1. 传统的形式实现, 在 person 实体类中重写 clone 办法 (必须先实现 Cloneable 接口),Address 实体类也要实现 Cloneable 接口


2. 采纳对象序列化和反序列化的形式 (举荐形式)
(1)persion 和 address 两个实体类都要实现序列化接口 Serializable
(2)persion 实体类重写 clone 办法

package org.springblade.modules.prototype;

import lombok.Data;
import java.io.*;

/**
 * @author zdx
 * @description
 */

@Data
public class Person implements Cloneable, Serializable {

    private String name;

    private Integer age;

    private Address address;

    @Override
    protected Object clone() throws CloneNotSupportedException {return deepClone();
    }

    public Person deepClone() {
        try {
            // 序列化
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);

            // 反序列化
            ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream bis = new ObjectInputStream(bais);
            return (Person) bis.readObject();} catch (Exception ex) {ex.printStackTrace();
            return null;
        }
    }
}

正文完
 0