Java深拷贝复制List的实现方法
1. 流程概述
为了实现Java中List的深拷贝,我们可以按照以下步骤进行操作:
flowchart TD
A(创建一个新的空List) --> B(遍历原始List中的每个元素)
B --> C(对每个元素执行深拷贝操作)
C --> D(将深拷贝后的元素添加到新List中)
D --> E(返回新List)
2. 代码实现
下面是每一步所需要的代码及其注释说明:
1. 创建一个新的空List
List<T> copiedList = new ArrayList<>();
copiedList是我们将要创建的新List,用于存储深拷贝后的元素。
2. 遍历原始List中的每个元素
for (T originalItem : originalList) {
// 深拷贝操作
}
我们使用增强的for循环来遍历原始List中的每个元素,并对每个元素执行深拷贝操作。
3. 对每个元素执行深拷贝操作
对于Java中的基本类型,我们可以直接赋值。对于自定义类型,我们需要使用对象的克隆方法或者序列化与反序列化来实现深拷贝。
a) 对象的克隆方法
如果对象实现了Cloneable接口并重写了clone()方法,我们可以使用对象的克隆方法来进行深拷贝。
T copiedItem = originalItem.clone();
originalItem是原始List中的每个元素,copiedItem是深拷贝后的新元素。
b) 序列化与反序列化
如果对象没有实现Cloneable接口,我们可以使用序列化与反序列化来进行深拷贝。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(originalItem);
oos.flush();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
T copiedItem = (T) ois.readObject();
originalItem是原始List中的每个元素,copiedItem是深拷贝后的新元素。
4. 将深拷贝后的元素添加到新List中
copiedList.add(copiedItem);
我们将深拷贝后的元素copiedItem添加到新List copiedList中。
5. 返回新List
return copiedList;
将新List返回给调用者。
3. 完整代码示例
下面是将上述步骤整合到一起的完整代码示例:
import java.io.*;
import java.util.*;
public class DeepCopyListExample {
public static <T extends Serializable> List<T> deepCopyList(List<T> originalList) throws IOException, ClassNotFoundException {
List<T> copiedList = new ArrayList<>();
for (T originalItem : originalList) {
T copiedItem = null;
if (originalItem instanceof Cloneable) {
// 使用对象的克隆方法进行深拷贝
try {
Method cloneMethod = originalItem.getClass().getMethod("clone");
copiedItem = (T) cloneMethod.invoke(originalItem);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
} else {
// 使用序列化与反序列化进行深拷贝
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(originalItem);
oos.flush();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
copiedItem = (T) ois.readObject();
}
copiedList.add(copiedItem);
}
return copiedList;
}
public static void main(String[] args) {
List<Integer> originalList = new ArrayList<>();
originalList.add(1);
originalList.add(2);
originalList.add(3);
try {
List<Integer> copiedList = deepCopyList(originalList);
System.out.println("Original List: " + originalList);
System.out.println("Copied List: " + copiedList);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
















