引用类型聚集的深拷贝,无需手动写循环:Apache Commons Lang (Serializati
在java中,我们如果想要对引用类型的聚集举行深拷贝。有一种方式,就是调用SerializationUtilsApache 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]