在开发过程中我们经常需要深度复制list,在不借助其他架包的情况下,方法靠谱的不多,这里提供方法,使用序列化的方式完成深度复制的工具;
首先创建一个POJO类:
package com.main.dto;
import java.io.Serializable;
public class User implements Serializable {
private Long id;
private String name;
private Long age;
private String sex;
public User() {}
public User(Long id, String name, Long age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
//setter 和 getter 省略
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
这里要注意一点,要继承接口Serializable
才能实现序列化
工具方法:
/**
* 深度复制的方法
*/
public static <T> List<T> listCopy(List<T> src) {
List<T> dest = null;
try {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
dest = (List<T>) in.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return dest;
}
测试方法:
@Test
public void test1() {
User user1 = new User(1L, "xm", 12L, "男");
User user2 = new User(2L, "xh", 13L, "女");
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
List<User> userList1 = userList;
List<User> userList2 = listCopy(userList);
userList.get(1).setAge(100L);
System.out.println("userList1--> " + userList1.toString());
System.out.println("userList2--> " + userList2.toString());
}
测试结果:
userList1--> [User{id=1, name='xm', age=12, sex='男'}, User{id=2, name='xh', age=100, sex='女'}]
userList2--> [User{id=1, name='xm', age=12, sex='男'}, User{id=2, name='xh', age=13, sex='女'}]
上面我们可以看出,这种方式是可以实现深度复制的,我们使用序列化的方式,将我们的数据写进字节流里,然后我们把字节流再读出来,实现这种深度复制,从本质上来说我们要复制的是它的物理内存里的信息,不是它的引用,这种方式可以实现。