一、什么是深拷贝
深拷贝是指在拷贝对象时,对于对象中引用类型的成员变量,需要拷贝其所引用的对象,而不是只拷贝其引用地址。
对于List等集合类型,其内部可能包含多个对象,这就需要对List进行深复制,确保复制出来的List中的对象与原List中对象没有任何关联。
二、浅拷贝与深拷贝的区别
浅拷贝是指将一个对象的引用复制给另一个对象,新对象与原对象会共享同一个对象。
深拷贝是指将一个对象完全复制一份,并开辟一个新的内存空间存储新对象,两个对象不共享内存空间。
三、常用的List深拷贝实现方法
1.使用BeanUtils
public staticList deepCopy(List src) { List dest = new ArrayList<>(); for (T t : src) { T temp = BeanUtils.copyProperties(t); dest.add(temp); } return dest; }
BeanUtils是Apache Commons BeanUtils的一个工具类,其提供了对JavaBean的各种操作。在上述代码中,我们使用BeanUtils.copyProperties()方法将List中的每个元素复制到新的List中,从而实现了List的深度复制。
2.使用JSON转换
public staticList deepCopy(List src) { List dest = new ArrayList<>(); String json = JSON.toJSONString(src); dest = JSON.parseObject(json, new TypeReference
>(){}); return dest; }
这种方式主要是使用了阿里巴巴的FastJson库,将List转换为JSON字符串,再将其转换为目标类型的List。
3.使用序列化
public staticList deepCopy(List src) { List dest = null; ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = null; try { out = new ObjectOutputStream(byteOut); out.writeObject(src); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in = new ObjectInputStream(byteIn); dest = (List ) in.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return dest; }
这种方式是通过将List进行序列化,然后反序列化生成新的List来实现深拷贝。但是这种方式会生成大量的字节码,不适合大量数据的拷贝。
四、总结
在Java中,深拷贝是非常有用的,避免因为对象引用的重用而造成数据错误。本文介绍了Java中List深拷贝的三种实现方式,开发者可以根据自己的需求选择合适的方式进行实现。