427的java基础八股(深拷贝,浅拷贝,引用拷贝)
·
深拷贝,浅拷贝,引用拷贝
目录
引用拷贝
基本数据类型存在栈中,对象的引用也在栈中,实际对象存在堆中
复制引用地址,但是跟原引用一样指向堆中的同一个对象,如果其中一个对对象作出修改,其他引用也会看到同样的变化。
对于对象中的基本类型字段,以及嵌套引用类型字段都是一起共享的
浅拷贝
创建新的堆对象,对于基本类型字段直接复制,对于引用类型字段复制其引用地址;对于基本类型字段的修改不影响原对象,对于引用类型字段,原对象也能看到对应的修改
需要继承Cloneable接口,重写Object类的clone方法,默认就是浅拷贝
深拷贝
深拷贝相当于是创建一个全新的对象,任何字段的修改都不会对原对象造成影响
第一种方法重写clone方法,先对当前对象进行浅拷贝,然后,手动拷贝嵌套对象,相当于创建一个新的嵌套对象。
第二种方法序列化,将对象序列化为字节流,再反序列化为新对象,需要继承Serializable接口;通过字节数组输出流,字节数组输入流,实现序列化与反序列化。
// 字节数组输出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this); // 序列化原对象
// 字节数组输入流
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (Person) ois.readObject(); // 反序列化得到新对象
例外
string类型创建后内容引用不可变,所以在浅拷贝中,对string字段进行修改会创建新的string对象,本质是引用拷贝
Object.clone是protect方法,需要重写为public才能被外部调用
序列化深拷贝限制,所有的嵌套类必须实现了Serializable接口,无法拷贝transient修饰的字段
更多推荐




所有评论(0)