您的位置:

Java List 复制

一、List 复制的概念及实现方式

List 复制是指将一个 List 中的所有元素全部复制到另一个 List 中,并且这两个 List 中的元素是相互独立的。基本实现方式包括深拷贝和浅拷贝。

1. 深拷贝(deep copy):将源 List 中的所有元素全部复制到新的 List 中,同时新 List 中的所有元素都是源 List 中元素的副本。即修改源 List 中的元素不会影响新的 List 中的元素。

List sourceList = new ArrayList<>();
sourceList.add("a");
sourceList.add("b");
sourceList.add("c");

List
    newList = new ArrayList<>(sourceList);
sourceList.set(0, "A");

System.out.println(sourceList); //[A, b, c]
System.out.println(newList); //[a, b, c]

   
  

2. 浅拷贝(shallow copy):将源 List 中的所有元素全部复制到新的 List 中,新 List 中的元素只是源 List 中元素的引用。即修改源 List 中的元素会同步影响新的 List 中的元素。

List
   > sourceList = new ArrayList<>();
List
     innerList = new ArrayList<>();
innerList.add(1);
innerList.add(2);
sourceList.add(innerList);

List
     
      > newList = new ArrayList<>(sourceList);
sourceList.get(0).set(0, 3);

System.out.println(sourceList); //[[3, 2]]
System.out.println(newList); //[[3, 2]]

      
     
    
   
  

二、使用 Collections.copy() 进行深拷贝

Collections.copy() 方法可以用于 List 的深拷贝,使用该方法需要满足以下两个条件:

1. 目标 List 的大小要等于源 List 的大小。

2. 目标 List 中的元素要支持赋值操作

List sourceList = new ArrayList<>();
sourceList.add("a");
sourceList.add("b");
sourceList.add("c");

List
    newList = new ArrayList<>(sourceList.size());
Collections.copy(newList, sourceList);

sourceList.set(0, "A");

System.out.println(sourceList); //[A, b, c]
System.out.println(newList); //[a, b, c]

   
  

三、使用 clone() 进行深拷贝

Java 中的 clone() 方法可以用于对象的深拷贝,List 是对象的一种,因此也可以用于 List 的深拷贝。使用该方法需要将 List 转换为数组进行 clone() 操作,再将数组转换为 List。

List sourceList = new ArrayList<>();
sourceList.add("a");
sourceList.add("b");
sourceList.add("c");

List
    newList = Arrays.asList(sourceList.toArray(new String[0])).stream().collect(Collectors.toList());
sourceList.set(0, "A");

System.out.println(sourceList); //[A, b, c]
System.out.println(newList); //[a, b, c]

   
  

四、小结

复制 List 是 Java 开发中常见的操作之一,它可以让我们在不改变源 List 的情况下,通过新的 List 进行操作。在复制 List 时需要注意深拷贝与浅拷贝的区别,并选择合适的方法进行操作。