在 Java 中,如果你想拷贝一个集合(例如,List、Set 或 Map),你有几种不同的选项,取决于你的需求和使用场景。

  1. 浅拷贝:
    浅拷贝创建了一个新的集合对象,但仅复制了原始集合中的引用,而不是实际的元素。Java 提供了 clone 方法来实现浅拷贝。
List<String> originalList = new ArrayList<>();
List<String> copiedList = new ArrayList<>(originalList); // 浅拷贝

// 或者使用 clone 方法
List<String> copiedListClone = (List<String>) ((ArrayList<String>) originalList).clone();
  1. 深拷贝:
    深拷贝创建了一个新的集合对象,并且复制了原始集合中的每个元素。这样,新的集合和原始集合彼此独立。

使用构造函数和addAll方法

List<String> originalList = new ArrayList<>();
List<String> copiedList = new ArrayList<>(originalList); // 创建新对象并复制引用

// 使用addAll方法实现深拷贝
List<String> deepCopiedList = new ArrayList<>();
deepCopiedList.addAll(originalList);

使用序列化与反序列化实现深拷贝

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class DeepCopyExample {
    public static <T extends Serializable> List<T> deepCopy(List<T> original) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);

        // 将原始列表写入输出流
        oos.writeObject(original);
        oos.flush();
        oos.close();

        // 从输出流中读取新的列表对象
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        List<T> copy = (List<T>) ois.readObject();
        ois.close();

        return copy;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        List<String> originalList = new ArrayList<>();
        originalList.add("Item 1");
        originalList.add("Item 2");

        List<String> deepCopiedList = deepCopy(originalList);

        System.out.println("Original List: " + originalList);
        System.out.println("Deep Copied List: " + deepCopiedList);
    }
}

请注意,使用序列化与反序列化进行深拷贝需要确保集合中的所有元素都是可序列化的。


乌拉
1 声望1 粉丝