数组拷贝的四种方式
- for
- clone
- System.arraycopy
- arrays.copyof
数组拷贝方式之一——for()
就是for循环咯!!!
1 | /** 1 for 循环拷贝*/ |
也是浅拷贝咯!
数组拷贝方式之二——clone()
(主要参考)细说 Java 的深拷贝和浅拷贝
在 Java 中,所有的 Class 都继承自 Object ,而在 Object 上,存在一个 clone() 方法,它被声明为了 protected ,所以我们可以在其子类中,使用它。而无论是浅拷贝还是深拷贝,都需要实现 clone() 方法,来完成操作。
首先需要说明的是,clone()是浅拷贝的方式!!!其次,我们应该如何实现深拷贝呢,有两种方法:
用多层浅拷贝达到深拷贝的目的,要知道,浅拷贝和深拷贝的区别就是在处理对象引用时,浅拷贝不会创造新的对象,而深拷贝会,但是如果一个对象的属性变成了基本类型数据,那么浅拷贝同样会创造新的对象,所以说,多层浅拷贝就能达到深拷贝的目的,例如:
在对fatherClass和childClass进行两级浅拷贝之后,fatherB就有浅拷贝变成了深拷贝,因为此时基本数据类型和Child对象都是指向不同的地址的,也就是二者都是不同的对象,所以就是达到了深拷贝的目的了。序列化(serialization)这个对象,再反序列化回来,就可以得到这个新的对象,无非就是序列化的规则需要我们自己来写。
总结下来就是做了5件事:- 确保对象图中的所有类都是可序列化的
- 创建输入输出流
- 使用这个输入输出流来创建对象输入和对象输出流
- 将你想要拷贝的对象传递给对象输出流
- 从对象输入流中读取新的对象并且转换回你所发送的对象的类
最后,推一个序列化实现深拷贝的例子:序列化的方式使得其变为深拷贝
数组拷贝方式之三——System.arraycopy()
native方法,依旧是一个浅拷贝——–> 详细传送门
数组拷贝方式之四——arrays.copyof()
1 | public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { |
你看看,底层也在用System.arraycopy()这个native方法,所以就不再赘述了,这个在ArrayList源码分析中也有涉及哦!!!!
深浅拷贝的区别: