Java复制List的几种方法

在Java的开发中,经常会遇到需要复制一个List的情况。而对于简单的List,可以直接使用如new ArrayList<>(originalList)来复制。但是当我们需要对List中的元素进行深拷贝或者需要复制一个自定义的List对象时,就需要使用其他方法来实现。
本文将详细介绍Java中复制List的几种方法,包括直接复制、使用构造方法、使用addAll()方法、使用Collections的copy()方法等等。
1. 使用直接赋值
最简单的方式就是使用直接赋值来复制List。如果原始List中的元素都是简单的基本类型,不涉及到引用类型,可以直接通过=来赋值。
示例代码如下:
List<String> originalList = new ArrayList<>();
originalList.add("apple");
List<String> copiedList = originalList;
上述代码中,我们直接通过将originalList赋值给copiedList来复制List,它们会指向同一个对象。这意味着对copiedList的操作也会影响到originalList。
2. 使用构造方法
如果我们需要深度复制一个List,即复制的List和原始List是独立的对象,可以使用构造方法来实现。
示例代码如下:
List<String> originalList = new ArrayList<>();
originalList.add("apple");
List<String> copiedList = new ArrayList<>(originalList);
上述代码中,通过new ArrayList<>(originalList)创建了一个新的List对象copiedList,copiedList中的元素与originalList相同,但它们是两个独立的对象。因此,对copiedList的操作不会影响到originalList。
3. 使用addAll()方法
通过使用addAll()方法,我们可以将原始List中的元素添加到一个新的List中,从而实现复制的目的。
示例代码如下:
List<String> originalList = new ArrayList<>();
originalList.add("apple");
List<String> copiedList = new ArrayList<>();
copiedList.addAll(originalList);
上述代码中,我们创建了一个新的List对象copiedList,然后调用copiedList.addAll(originalList)方法将originalList中的元素添加到copiedList中。因此,copiedList和originalList是两个独立的对象。
4. 使用Collections的copy()方法
Java的Collections类提供了一个copy()方法,可以用来复制List。
示例代码如下:
List<String> originalList = new ArrayList<>();
originalList.add("apple");
List<String> copiedList = new ArrayList<>(Collections.nCopies(originalList.size(), null));
Collections.copy(copiedList, originalList);
上述代码中,我们首先创建了一个大小与originalList相同的空List copiedList,然后通过Collections.copy(copiedList, originalList)方法将originalList中的元素复制到copiedList中。
需要注意的是,Collections.copy()方法只能复制已经存在的List,而不能创建新的List对象。
5. 自定义类的List复制
当我们需要复制一个包含自定义类的List对象时,需要注意该自定义类是否实现了Cloneable接口。如果已经实现了Cloneable接口,可以通过复写clone()方法来实现深度复制。
示例代码如下:
class Fruit implements Cloneable {
private String name;
public Fruit(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Fruit [name=" + name + "]";
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
List<Fruit> originalList = new ArrayList<>();
originalList.add(new Fruit("apple"));
List<Fruit> copiedList = new ArrayList<>();
for (Fruit fruit : originalList) {
copiedList.add((Fruit) fruit.clone());
}
// 修改复制后的List中的元素
copiedList.get(0).setName("banana");
System.out.println("originalList: " + originalList);
System.out.println("copiedList: " + copiedList);
}
}
上述代码中,我们定义了一个Fruit类,并在Main类中演示了如何复制包含Fruit对象的List。使用for循环和clone()方法来实现深度复制,确保复制后的List中的元素与原始List完全独立。
输出结果如下:
originalList: [Fruit [name=apple]]
copiedList: [Fruit [name=banana]]
从输出结果可以看出,复制后的List(copiedList)中的元素与原始List(originalList)中的元素是完全独立的。
总结
本文介绍了Java中复制List的几种方法,包括直接赋值、使用构造方法、使用addAll()方法、使用Collections的copy()方法以及自定义类的List复制。
在实际开发中,我们根据具体的需求选择适合的方法,其中使用构造方法和addAll()方法是最常用的方式。在复制包含自定义类的List时,需要确保自定义类实现了Cloneable接口,并复写了clone()方法。复制List的过程需要注意是否需要进行深拷贝,避免对象引用的问题。
极客笔记