引用类型集合的深拷贝,无需手动写循环:Apache Commons Lang (SerializationUtils)

在java中,我们如果想要对引用类型的集合进行深拷贝。有一种方式,就是调用**SerializationUtils**

Apache Commons Lang (SerializationUtils)

Apache Commons Lang 提供了 SerializationUtils 类,可以利用 Java 的序列化机制来进行集合及其元素的深拷贝。通过将集合进行序列化和反序列化,达到深拷贝的效果。

java 复制代码
        List<Person> originalList = new ArrayList<>();
        originalList.add(new Person("Alice"));
        originalList.add(new Person("Bob"));

        List<Person> copiedList = SerializationUtils.clone((ArrayList<Person>) originalList);

        System.out.println("Original List: " + originalList);
        System.out.println("Copied List: " + copiedList);

        // 修改拷贝中的对象,验证深拷贝
        copiedList.get(0).name = "Charlie";

        System.out.println("Original List: " + originalList);
        System.out.println("Copied List: " + copiedList);

结果:

Original List: [Person{name='Alice'}, Person{name='Bob'}]

Copied List: [Person{name='Alice'}, Person{name='Bob'}]

Original List: [Person{name='Alice'}, Person{name='Bob'}]

Copied List: [Person{name='Charlie'}, Person{name='Bob'}]
注意: 这种方法要求集合及其元素实现 Serializable 接口,因此适用于所有支持序列化的对象。


如果你希望用其他方法对集合进行深拷贝,可以选择以下几种方式:

除了SerializationUtils和以下的ObjectMapper ,都是需要手动遍历添加引用类型对象,尽管重写了clone()方法

  1. Google Guava (Lists.newArrayList()):通过手动遍历和元素复制来实现深拷贝。
  2. Jackson (ObjectMapper):通过序列化和反序列化的方式进行深拷贝。
  3. Spring Framework (BeanUtils.copyProperties()):适用于 JavaBean 对象,可以在循环中手动深拷贝。
  4. Java 8 Cloneable 接口结合流式操作 :如果对象实现了 Cloneable,可以利用 clone() 方法结合 Stream API 进行深拷贝。

这里只举一个例子:

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

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

        // 使用 Java 8 Stream 和 Cloneable 实现深拷贝
        List<Person> deepCopy = originalList.stream()
                .map(person -> person.clone())  // 假设 Person 实现了 Cloneable
                .collect(Collectors.toList());

        // 输出检查
        System.out.println(originalList);
        System.out.println(deepCopy);
    }
}
相关推荐
超级大只老咪4 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶4 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长4 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子4 小时前
JDK 安装配置
java·开发语言
星哥说事4 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
派大鑫wink4 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
xUxIAOrUIII4 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home4 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
醇氧4 小时前
org.jetbrains.annotations的@Nullable 学习
java·开发语言·学习·intellij-idea
Java&Develop5 小时前
Aes加密 GCM java
java·开发语言·python