【Java】浅拷贝,深拷贝和延迟拷贝

319 阅读1分钟

1.1 浅拷贝

浅拷贝只拷贝值,不拷贝引用类型。也就是说,浅拷贝出来的对象,其中的引用属性还是跟原对象指向同一个地址对象的。

1.2 深拷贝

深拷贝不仅拷贝基本类型变量,也拷贝引用类型变量。 Java不显示支持深拷贝,但是可以通过复写clone方法、序列化、Collections.copy()等方式变相实现。

  • Collections.copy()

只将原集合中的值赋给目的集合,采用覆盖的方式。这就要求目的集合长度要不比原集合小。 根据以上结论:我们可以创建一个与原集合大小相同的空的新集合来作为目的集合。

方法一:

ArrayList<Integer> mycopy=new ArrayList<Integer>();

mycopy=(ArrayList<Integer>) vec.clone();

方法二:

ArrayList<Integer> mycopy=new ArrayList<Integer>(Arrays.asList(new Integer[vec.size()]));
Collections.copy(mycopy, vec);

1.3 延迟拷贝

延迟拷贝是浅拷贝和深拷贝的一个组合。最开始拷贝一个对象时,会使用速度较快的浅拷贝,还会使用一个计数器来记录有多少对象共享这个数据。当程序想要修改原始的对象时,它会决定数据是否被共享(通过检查计数器)并根据需要进行深拷贝。