写在前面
浅拷贝: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这个没搞明白。。。
写在最后
还是要应用了,才能熟络,纸上谈兵有点难受,项目搞起来
大家一起加油,一起进步!