Java深拷贝和浅拷贝

浅拷贝:

创建一个新对象,会很精确的复制原来对象属性类型或者属性引用地址。

如:

1
2
List<T> list1 = list,List<T> list2 = new ArrayList<T>();
list2.addAll(list1)或者list2 = list1.clone();

都是通过浅拷贝得到的。但是这样我们在操作拷贝后的文件时,会影响到原来对象。

这时候深拷贝就该上场了

深拷贝:

是将原有对象的属性和地址重新复制一份,这样在操作复制后的对象时,就不会对原有的对象有影响了,但是深拷贝相较于浅拷贝在速度上会慢一点、空间上会大一些。

深拷贝实现是通过串行化来做深度复制,是先使对象实现Serializable接口(很重要),然后把对象写到一个流中,再从流中读取出来,便可以创建新的对象。

T implements Serializable 很重要 很重要 重要的事说三遍。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static <T> List<T> deepCopy(List<T> src){
List<T> dest = null;
try {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
dest = (List<T>) in.readObject();
}catch (Exception e){
logger.error(e.getMessage());
}
return dest;
}

也可以将需要copy 的数据先转换成json 然后再转换成所需要的object (copy对象较大的情况)
之前做某一个模块的时候深拷贝的效率不是很好 最后通过Gson处理的


Java深拷贝和浅拷贝
http://yoursite.com/post/90651477.html/
Author
Chase Wang
Posted on
December 19, 2017
Licensed under