最近用到list的深浅复制,做个记录
需求是复制当前list,进行操作而不改变原有的list的数据
先初始化一个list
public static List<Person> init() {
List<Person> personList = new ArrayList<Person>();
Person p1 = new Person(20, "小李");
Person p2 = new Person(21, "小王");
Person p3 = new Person(22, "小赵");
personList.add(p1);
personList.add(p2);
personList.add(p3);
return personList;
}
public static void printList(List<Person> list, String str) {
System.out.println(str + "List---begin---");
for (Person person : list) {
System.out.println(person.getName());
}
System.out.println(str + "List---end---");
}
对初始化的list进行循环复制操作
public static void test01(List<Person> personList) {
List<Person> destList = new ArrayList<Person>(personList.size());
for (Person p : personList) {
destList.add(p);
}
personList.get(0).setName("修改小李");
printList(personList, "原");
printList(destList, "目标");
}
结果:
原List—begin—
修改小李
小王
小赵
原List—end—
目标List—begin—
修改小李
小王
小赵
目标List—end—
public static void test02(List<Person> personList) {
List<Person> destList=new ArrayList<Person>(personList);
destList.get(0).setName("修改小李");
printList(personList, "原");
printList(destList, "目标");
}
结果:
原List—begin—
修改小李
小王
小赵
原List—end—
目标List—begin—
修改小李
小王
小赵
目标List—end—
public static void test03(List<Person> personList) {
List<Person> destList=new ArrayList<Person>(personList.size());
destList.addAll(personList);
destList.get(0).setName("修改小李");
printList(personList, "原");
printList(destList, "目标");
}
结果:
原List—begin—
修改小李
小王
小赵
原List—end—
目标List—begin—
修改小李
小王
小赵
目标List—end—
public static void test04(List<Person> personList) {
Person[] srcPersons=personList.toArray(new Person[0]);
Person[] destPersons=new Person[srcPersons.length];
System.arraycopy(srcPersons, 0, destPersons, 0, srcPersons.length);
List<Person> destList=Arrays.asList(destPersons);
destList.get(0).setName("修改小李");
printList(personList, "原");
printList(destList, "目标");
}
结果:
原List—begin—
修改小李
小王
小赵
原List—end—
目标List—begin—
修改小李
小王
小赵
目标List—end—
public static void test05(List<Person> personList) {
List<Person> destList=new ArrayList<Person>();
CollectionUtils.addAll(destList, new Person[personList.size()]);
Collections.copy(destList, personList);
destList.get(0).setName("修改小李");
printList(personList, "原");
printList(destList, "目标");
}
结果:
原List—begin—
修改小李
小王
小赵
原List—end—
目标List—begin—
修改小李
小王
小赵
目标List—end—
亲测有效,,,首先你的person需要实现序列化
public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List<T> dest = (List<T>) in.readObject();
return dest;
}
public static void test06(List<Person> personList) {
List<Person> destList = new ArrayList<>();
try {
destList = deepCopy(personList);
} catch (Exception e) {
e.printStackTrace();
}
destList.get(0).setName("修改小李");
printList(personList, "原");
printList(destList, "目标");
}
原List—begin—
小李
小王
小赵
原List—end—
目标List—begin—
修改小李
小王
小赵
目标List—end—