浅copy:复制后list中各个元素与源list中的元素是通过地址引用传递的,(即源list中元素属性的改变会引起复制后数据的变化,复制后的list也是如此)
深度copy:源list与目标list中元素数据互不影响
List copy的几种方式:
1、使用循环或者迭代器,遍历源list数据并添加到目标list中
浅copy
2、使用list.addAll 方法
浅copy
3、Collections.copy(dest, src)
浅copy
4、先将list转数组(list.toArray())再复制(System.arrayCopy/Arrays.copy均为浅cpoy),最后再转回list (Arrays.asList(array))
浅copy
5、使用序列化(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 list4 = (List) ois.readObject();
ois.close();
深度copy
6、使用clone方法(list的元素对象需要实现Cloneable接口并重写clone方法);在遍历源list的过程中将每个元素的clone对象add进目标List
深度copy
总结:深度copy与浅copy的区别,主要在于对java中对象值传递和引用传递的认识。
List和数组虽然也是对象,但在copy的过程中看重的是其中存储元素,所以要想实现集合和数组元素复制前后互不影响的深copy,就要new一个新的元素对象(1是使用构造函数;2是使用clone方法;3是反序列化)