java 两个list的深拷贝自定义对象
时间: 2024-11-06 20:03:24 浏览: 7
java深入理解浅拷贝和深拷贝
5星 · 资源好评率100%
在 Java 中,如果需要对 List 存储的自定义对象进行深拷贝,你需要确保每个对象的所有属性都是不可变的或者是可以安全复制的,因为浅拷贝只会复制引用,不会复制对象本身的内容。以下是使用序列化和反序列化(Serializable 接口)来实现深拷贝的一个简单例子:
```java
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
class CustomObject implements Serializable {
private String data; // 自定义对象包含的字段
// 构造函数、getter 和 setter...
}
public class DeepCopyExample {
public static List<CustomObject> deepCopy(List<CustomObject> originalList) {
// 使用序列化反序列化的机制进行深拷贝
return (List<CustomObject>) originalList.stream()
.map(obj -> (CustomObject) SerializationUtils.deserialize(SerializationUtils.serialize(obj)))
.collect(Collectors.toList());
}
private static class SerializationUtils {
@SafeVarargs
private static byte[] serialize(Object... objects) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
for (Object obj : objects) {
oos.writeObject(obj);
}
oos.close();
return bos.toByteArray();
}
@SafeVarargs
private static Object deserialize(byte[] bytes) throws Exception {
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
public static void main(String[] args) {
List<CustomObject> original = new ArrayList<>();
// ...填充原始列表
List<CustomObject> copiedList = deepCopy(original);
// 现在copiedList是一个独立于original的新列表,所有元素都是深拷贝
}
}
```
在这个示例中,`SerializationUtils` 类包含了序列化和反序列化的方法,通过将每个对象先序列化再反序列化,实现了对象的深拷贝。
阅读全文