浅谈深拷贝浅拷贝

写在前面

浅拷贝:b=a;a改变;b改变

深拷贝:b=a;a改变;b不变

1、深拷贝

        int a=1;
        int b=a;
        a=3;
        System.out.println(a);
        System.out.println(b);

运行结果

3
1

可以看到改变a的值时b的值并没有发生变化

因为在Java中,我们的基本数据类型是存在虚拟机栈中

 可以看到,a和b都是自己单独的内存空间

2、浅拷贝

        LinkedList<Integer> a=new LinkedList<>();
        LinkedList<Integer> b=a;
        a.add(2);
        System.out.println(a);
        System.out.println(b);

运行结果

[2]
[2]

可以看到,我们只对a进行了添加操作,但是b也随之更改了

这是因为在Java中引用数据类型的对象是存在堆内存中,a,b只是我们对其的引用

如图,我们的a指向堆内存中new出来分配的地址空间0x123,随后把a的指向赋给b,此时b也指向0x123,此时,对a的更改操作,即是对她引用对象的更改,即是对b引用对象的更改,所以说b也跟着变化了

3、实现深拷贝

1、手动赋值,效率高,但代码过于啰嗦。
2、序列化与反序列化,使用SerializationUtils的clone(Object obj)方法,要求拷贝的对象实现了Serializable,Map不行,使用HashMap即可。
3、用fastjson从Object转成json,然后转回object,本质上是反射
以上三种方法参考自:原文链接:https://blog.csdn.net/huwentao_totti/article/details/82755217

1.

我首先想到的就是重新new一个,为拷贝的值new一个新的内存空间;这个应该类似第一种方法吧;

        LinkedList<Integer> a=new LinkedList<>();
        a.add(1);
        LinkedList<Integer> b=new LinkedList<>(a);
        a.add(2);
        System.out.println(a);
        System.out.println(b);

运行结果

[1, 2]
[1]

可以看到深拷贝是实现了的

2.SerializationUtils的clone(Object obj)

HashMap<Integer,Integer> a=new HashMap<>();   
HashMap<Integer,Integer> b= (HashMap<Integer, Integer>) SerializationUtils.clone(a);
a.put(1,2);
System.out.println(a);
System.out.println(b);

运行结果

{1=2}
{}

3.json这个没搞明白。。。

写在最后

还是要应用了,才能熟络,纸上谈兵有点难受,项目搞起来

大家一起加油,一起进步!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值