一、什麼是深拷貝
深拷貝是指在拷貝對象時,對於對象中引用類型的成員變數,需要拷貝其所引用的對象,而不是只拷貝其引用地址。
對於List等集合類型,其內部可能包含多個對象,這就需要對List進行深複製,確保複製出來的List中的對象與原List中對象沒有任何關聯。
二、淺拷貝與深拷貝的區別
淺拷貝是指將一個對象的引用複製給另一個對象,新對象與原對象會共享同一個對象。
深拷貝是指將一個對象完全複製一份,並開闢一個新的內存空間存儲新對象,兩個對象不共享內存空間。
三、常用的List深拷貝實現方法
1.使用BeanUtils
public static List 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 static List deepCopy(List src) { List dest = new ArrayList(); String json = JSON.toJSONString(src); dest = JSON.parseObject(json, new TypeReference<List>(){}); return dest; }
這種方式主要是使用了阿里巴巴的FastJson庫,將List轉換為JSON字元串,再將其轉換為目標類型的List。
3.使用序列化
public static List 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深拷貝的三種實現方式,開發者可以根據自己的需求選擇合適的方式進行實現。
原創文章,作者:LPEQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/141109.html