一、List 复制的概念及实现方式
List 复制是指将一个 List 中的所有元素全部复制到另一个 List 中,并且这两个 List 中的元素是相互独立的。基本实现方式包括深拷贝和浅拷贝。
1. 深拷贝(deep copy):将源 List 中的所有元素全部复制到新的 List 中,同时新 List 中的所有元素都是源 List 中元素的副本。即修改源 List 中的元素不会影响新的 List 中的元素。
ListsourceList = 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 中的元素要支持赋值操作
ListsourceList = 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。
ListsourceList = 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 时需要注意深拷贝与浅拷贝的区别,并选择合适的方法进行操作。