浅拷贝
对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象"里面的对象"。
"里面的对象"会在原来的对象和它的副本之间共享。
引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递。
自带的copy实现浅拷贝。需要实现cloneable接口
深拷贝
不同于浅拷贝,深拷贝是一个整个独立的对象拷贝。如果我们对整个Person对象进行深拷贝,我们会对整个对象的结构都进行拷贝。
将对象序列化为字节序列后,默认会将该对象的整个对象图进行序列化,再通过反序列即可完美地实现深拷贝。
public Object copyObject(Object object) throws IOException, ClassNotFoundException {
//创建字节数组输出流将拷贝对象写入
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//创建对象输出流将字节数组输出流传入直接将对象写入字节输出流
ObjectOutputStream objectOutputStrea = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStrea.writeObject(object);
//将刚写入的输出流转化为字节数组传入字节数组输入流
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
//对象输入流包装读取为一个对象
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return objectInputStream.readObject();
}