前进之路 发表于 2024-12-15 17:27:23

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

在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:
Copied List:
Original List:
Copied List:
    注意: 这种方法要求聚集及其元素实现 Serializable 接口,因此实用于所有支持序列化的对象。
如果你盼望用其他方法对聚集举行深拷贝,可以选择以下几种方式:
除了SerializationUtils和以下的ObjectMapper,都是需要手动遍历添加引用类型对象,尽管重写了clone()方法

[*]Google Guava (Lists.newArrayList()):通过手动遍历和元素复制来实现深拷贝。
[*]Jackson (ObjectMapper):通过序列化和反序列化的方式举行深拷贝。
[*]Spring Framework (BeanUtils.copyProperties()):实用于 JavaBean 对象,可以在循环中手动深拷贝。
[*]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);
    }
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 引用类型聚集的深拷贝,无需手动写循环:Apache Commons Lang (Serializati