Java 对象集合拷贝

在开发 Java 程序过程中,经常会涉及到对对象集合进行拷贝的需求。对象集合拷贝可以帮助我们实现对象的复制,以便进行独立操作,而不影响原始集合。本文将介绍 Java 中常用的对象集合拷贝方法,并提供相应的代码示例。

浅拷贝与深拷贝

在进行对象集合拷贝之前,我们需要了解两个概念:浅拷贝和深拷贝。

浅拷贝是指只拷贝对象本身,而不拷贝对象内部的引用类型属性。拷贝的新对象与原始对象共享引用类型属性,因此对其中一个对象的修改会影响到另一个对象。

深拷贝是指不仅拷贝对象本身,还要递归拷贝对象内部的引用类型属性。拷贝的新对象与原始对象完全独立,彼此之间的修改互不影响。

根据具体的需求,我们可以选择使用浅拷贝或深拷贝的方式进行对象集合的拷贝。

方法一:遍历拷贝

最简单的方法是使用循环遍历原始集合,逐个拷贝其中的对象,然后将拷贝后的对象添加到新的集合中。这种方式适用于对象集合中的对象是可序列化的情况。

下面是一个示例代码,演示了如何使用遍历拷贝的方式实现对象集合的拷贝:

import java.util.ArrayList;
import java.util.List;

public class DeepCopyExample {
    public static void main(String[] args) {
        List<Person> originalList = new ArrayList<>();
        originalList.add(new Person("Alice", 25));
        originalList.add(new Person("Bob", 30));

        List<Person> copyList = new ArrayList<>();
        for (Person person : originalList) {
            copyList.add(new Person(person.getName(), person.getAge()));
        }

        System.out.println("Original List: " + originalList);
        System.out.println("Copy List: " + copyList);
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

上述代码中,我们创建了一个 Person 类,其中包含姓名和年龄两个属性。然后,我们创建了一个原始的对象集合 originalList,并添加了两个 Person 对象。接着,我们使用循环遍历的方式将原始集合中的对象拷贝到新的集合 copyList 中,确保每个对象都是独立的。最后,我们输出原始集合和拷贝集合的内容,可以看到它们是相互独立的。

方法二:序列化与反序列化

如果对象集合中的对象不可序列化,我们可以使用序列化与反序列化的方式实现深拷贝。这种方式需要保证对象及其引用类型属性都实现了 Serializable 接口。

下面是一个示例代码,演示了如何使用序列化与反序列化的方式实现对象集合的深拷贝:

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

public class DeepCopyExample {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        List<Person> originalList = new ArrayList<>();
        originalList.add(new Person("Alice", 25));
        originalList.add(new Person("Bob", 30));

        List<Person> copyList = new ArrayList<>();
        for (Person person : originalList) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(person);

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            copyList.add((Person) ois.readObject());
        }

        System.out.println("Original List: " + originalList