在開發過程中我們經常需要深度複製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='女'}]
上面我們可以看出,這種方式是可以實現深度複製的,我們使用序列化的方式,將我們的數據寫進字節流裏,然後我們把字節流再讀出來,實現這種深度複製,從本質上來說我們要複製的是它的物理內存裏的信息,不是它的引用,這種方式可以實現。