引用类型聚集的深拷贝,无需手动写循环:Apache Commons Lang (Serializati ...

打印 上一主题 下一主题

主题 970|帖子 970|积分 2910

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在java中,我们如果想要对引用类型的聚集举行深拷贝。有一种方式,就是调用SerializationUtils
Apache Commons Lang (SerializationUtils)

Apache Commons Lang 提供了 SerializationUtils 类,可以利用 Java 的序列化机制来举行聚集及其元素的深拷贝。通过将聚集举行序列化和反序列化,达到深拷贝的结果。
  1.         List<Person> originalList = new ArrayList<>();
  2.         originalList.add(new Person("Alice"));
  3.         originalList.add(new Person("Bob"));
  4.         List<Person> copiedList = SerializationUtils.clone((ArrayList<Person>) originalList);
  5.         System.out.println("Original List: " + originalList);
  6.         System.out.println("Copied List: " + copiedList);
  7.         // 修改拷贝中的对象,验证深拷贝
  8.         copiedList.get(0).name = "Charlie";
  9.         System.out.println("Original List: " + originalList);
  10.         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()方法

  • Google Guava (Lists.newArrayList()):通过手动遍历和元素复制来实现深拷贝。
  • Jackson (ObjectMapper):通过序列化和反序列化的方式举行深拷贝。
  • Spring Framework (BeanUtils.copyProperties()):实用于 JavaBean 对象,可以在循环中手动深拷贝。
  • Java 8 Cloneable 接口结合流式利用:如果对象实现了 Cloneable,可以利用 clone() 方法结合 Stream API 举行深拷贝。
这里只举一个例子:
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. public class DeepCopyExample {
  5.     public static void main(String[] args) throws CloneNotSupportedException {
  6.         List<Person> originalList = new ArrayList<>();
  7.         originalList.add(new Person("Alice", 30));
  8.         originalList.add(new Person("Bob", 25));
  9.         // 使用 Java 8 Stream 和 Cloneable 实现深拷贝
  10.         List<Person> deepCopy = originalList.stream()
  11.                 .map(person -> person.clone())  // 假设 Person 实现了 Cloneable
  12.                 .collect(Collectors.toList());
  13.         // 输出检查
  14.         System.out.println(originalList);
  15.         System.out.println(deepCopy);
  16.     }
  17. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表