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中方式

相关文章
相关标签/搜索