集合深度拷贝工具方法
时间: 2023-11-19 17:09:55 浏览: 102
C#深度拷贝克隆源码
在 Java 中,可以使用以下两种方式实现集合的深拷贝:
1. 使用序列化与反序列化
这种方式需要将集合对象先序列化成字节数组,再通过反序列化生成一个新的对象。由于序列化会将对象的所有属性都进行深拷贝,因此可以实现集合的深拷贝。示例代码如下:
```java
public static <T extends Serializable> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List<T> dest = (List<T>) in.readObject();
return dest;
}
```
2. 遍历拷贝
这种方式需要手动遍历集合中的每个元素,对每个元素进行深拷贝,最后将所有拷贝后的元素添加到一个新的集合中。示例代码如下:
```java
public static <T extends Serializable> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
List<T> dest = new ArrayList<T>(src.size());
for (T element : src) {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(element);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
T copy = (T) in.readObject();
dest.add(copy);
}
return dest;
}
```
需要注意的是,这两种方式都要求集合中的元素必须实现 Serializable 接口。如果集合中的元素没有实现 Serializable 接口,则需要手动实现深拷贝方法。
阅读全文