当前位置: 首页 > news >正文

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

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

Apache Commons Lang (SerializationUtils)

Apache Commons Lang 提供了 SerializationUtils 类,可以利用 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 进行深拷贝。

这里只举一个例子:

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);}
}
http://www.lryc.cn/news/503579.html

相关文章:

  • HTML、CSS表格的斜表头样式设置title 画对角线
  • docker 安装mysql 5.7 详细保姆级教程
  • Kioptrix level3
  • UE5 Lyra项目源码分析-关卡配置加载
  • Cursor重置机器码-解决Too many free trials.
  • transformer学习笔记-自注意力机制(2)
  • 呼叫中心呼入大模型如何对接传统呼叫中心系统?
  • [Unity] Text文本首行缩进两个字符
  • 最新版Chrome浏览器加载ActiveX控件之Adobe PDF阅读器控件
  • springboot 对接 ollama
  • 【数据库】选择题+填空+简答
  • 从0开始写android 之xwindow
  • The Past, Present and Future of Apache Flink
  • 多模块应用、发布使用第三方库(持续更新中)
  • An error happened while trying to locate the file on the Hub and we cannot f
  • UE5安装Fab插件
  • Linux C语言操作sqlite3数据库
  • 【人工智能】因果推断与数据分析:用Python探索数据间的因果关系
  • freeswitch(30秒自动挂断)
  • 大模型呼入机器人有哪些功能特点?(转)
  • 网络工程师常用软件之配置对比软件
  • Linux之远程登录
  • #渗透测试#漏洞挖掘#红蓝攻防#js分析(上)
  • 数智读书笔记系列006 协同进化:人类与机器融合的未来
  • 操作系统(7)处理机调度
  • folly之侵入式链表
  • GPT-5 训练遇阻:预期目标难达成与交付延期的深度剖析
  • C缺陷与陷阱 — 3 深入理解表达式
  • Linux常用指令-----中
  • k8s 部署方式kustomization和helm的区别