list的浅复制和深复制

list的浅复制和深复制

  • 浅复制
    • 一.遍历循环复制
    • 二.使用List实现类的构造方法
    • 三.使用list.addAll()方法
    • 四.使用System.arraycopy()方法
    • 五.java.util.Collections.copy()方法
  • 深复制
    • 六.使用序列化方法(相对靠谱的方法)

最近用到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—

二.使用List实现类的构造方法

 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—

三.使用list.addAll()方法

 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—

四.使用System.arraycopy()方法

 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—

五.java.util.Collections.copy()方法

 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—

你可能感兴趣的:(list的浅复制和深复制)