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