发布时间:2018-06-09作者:laosun阅读(2006)
Java 对象深浅拷贝:浅拷贝只复制一个对象(包括基本类型),对象内部存在的指向其他对象数组或者引用则不复制 ,拷贝后两个指针指向同一个内存空间,类似于文件创建快捷方式。深拷贝:对象以及对象内部的引用均复制,深拷贝后指针指向两个不同地址,重新new一个一模一样的对象,深拷贝的两个对象完全独立,解决不能管理子对象的问题的。
浅拷贝只复制一个对象(包括基本类型),对象内部存在的指向其他对象数组或者引用则不复制 ,拷贝后两个指针指向同一个内存空间,类似于文件创建快捷方式。
Person person = new Person("sunjs",100); Person person1 = person;
调用Object的Clone的函数(也是浅拷贝)
Person person = new Person("sunjs",100); Person person1 =(Person) person.clone();
这里再补充一下,发现很多人有误解:
如果我们有个对象Student,里边有String、int或者其他数据类型。还有一个引用对象。
那么浅拷贝后,Student对象中的String、int等基本数据类型修改,不会影响拷贝后的对象的内容。但是引用对象的修改会影响。
手写例子:
public class Student{ private String name; private int age; private booolean flag; private Student2 student2;//这种叫做引用对象。浅拷贝后,修改任意一个对象的student2都会对应的进行修改,因为没有拷贝这个对象所占用的内存空间,使用的还是一份 //但是 修改name,age,flag等基本数据类型,互不影响。 //set get // }
深拷贝:对象以及对象内部的引用均复制,深拷贝后指针指向两个不同地址,重新new一个一模一样的对象,深拷贝的两个对象完全独立,解决不能管理子对象的问题的。
Person person = new Person("sunjs",100); Person person1 =(Person) person.deepClone();
推荐使用序列化实现对象的拷贝
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class CloneUtils { // 拷贝一个对象 @SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T obj) { // 拷贝产生的对象 T clonedObj = null; try { // 读取对象字节数据 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); oos.close(); // 分配内存空间,写入原始对象,生成新对象 ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); // 返回新对象,并做类型转换 clonedObj = (T) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } return clonedObj; } }
版权属于: 技术客
原文地址: https://www.sunjs.com/article/detail/cf607e42f19d4d7f842df3e137c96ca3.html
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。