深拷贝和浅拷贝

本文介绍了Java中的浅拷贝和深拷贝概念,以及它们的区别。通过实例展示了如何实现浅拷贝,包括实现Clonable接口以及使用序列化方法。同时,文章指出手动实现深拷贝的繁琐,并提到了使用序列化或其他第三方库如fastjson、Gson进行深拷贝的简化方案。
摘要由CSDN通过智能技术生成

浅拷贝和深拷贝

​ 在Java语言中如果我们想要拷贝一个对象,有两种拷贝方式深拷贝和浅拷贝

浅拷贝在拷贝的时候只复制了对象的引用,实际使用还是堆中同一份对象.改变A中的属性后,B也会改变

深拷贝会在堆中创建一个新对象并和之前对象属性相同,因此改变源对象A后,B也不会改变

image-20211128201701816

浅拷贝的实现方法

通过将要拷贝的类实现Clonable接口,重写clone方法

方法内部调用super.clone()方法.

image-20211128213838781

package 笔记代码.深拷贝;

import java.util.ArrayList;

public class PCB implements Cloneable{
    int a;
    Integer b;
    ArrayList<Integer> list = new ArrayList<>();
    public PCB(){
        for (int i = 0; i < 100; i++) {
            list.add(i);
        }
    }

    public ArrayList<Integer> getList() {
        return list;
    }

    public void setList(ArrayList<Integer> list) {
        this.list = list;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public Integer getB() {
        return b;
    }

    public void setB(Integer b) {
        this.b = b;
    }

    @Override
    public PCB clone() {
        try {
            PCB clone = (PCB) super.clone();
            // TODO: 复制此处的可变状态,这样此克隆就不能更改初始克隆的内部
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

从调试结果可以看出pcb与clone不是一个对象,但是其内部引用类型的成员变量的地址都没有发生变化.如同上面结构

实现方式

实现Clonable接口,重写clone方法

image-20211128220518745

image-20211128220546801

image-20211128220538309

上述深拷贝都需要自己一条条属性进行实现,如果后续添加了属性那么将会非常麻烦

因此我们可以使用一些拷贝工具

序列化方式

image-20211128221605307

 public PCB cloneSerializable() {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(bos);
            oos.writeObject(this);

            // 反序列化
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);

            return (PCB) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
return null;

    }

image-20211128221652437

image-20211128221712296

也可以使用fastjson Gson等第三方工具进行序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值