Java中List(Array)元素複製的問題

淺copy:複製後list中各個元素與源list中的元素是經過地址引用傳遞的,(即源list中元素屬性的改變會引發複製後數據的變化,複製後的list也是如此)html

深度copy:源list與目標list中元素數據互不影響java

 

List copy的幾種方式:數組

一、使用循環或者迭代器,遍歷源list數據並添加到目標list中函數

    淺copycode

二、使用list.addAll 方法htm

淺copy對象

三、Collections.copy(dest, src)blog

淺copy接口

四、先將list轉數組(list.toArray())再複製(System.arrayCopy/Arrays.copy均爲淺cpoy),最後再轉回list (Arrays.asList(array))get

淺copy

五、使用序列化(list中元素對象須要實現Serializable接口)

ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(list);
			oos.close();
			
			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
			baos.close();
			ObjectInputStream ois = new ObjectInputStream(bais);
			List<User> list4 = (List<User>) ois.readObject();
			ois.close();

深度copy

六、使用clone方法(list的元素對象須要實現Cloneable接口並重寫clone方法);在遍歷源list的過程當中將每一個元素的clone對象add進目標List

深度copy

 

總結:深度copy與淺copy的區別,主要在於對java中對象值傳遞和引用傳遞的認識。

List和數組雖然也是對象,但在copy的過程當中看重的是其中存儲元素,因此要想實現集合和數組元素複製先後互不影響的深copy,就要new一個新的元素對象(1是使用構造函數;2是使用clone方法;3是反序列化)

java中建立對象的5中方式

相關文章
相關標籤/搜索