浅拷贝:
创建一个新对象,会很精确的复制原来对象属性类型或者属性引用地址。
如:
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处理的