淺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是反序列化)