- 使用序列化和反序列化:将集合对象序列化为字节流,然后再反序列化成一个新的对象。这种方式需要确保集合中的所有元素都是可序列化的。
import java.io.*;
public static source) { try { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(source);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List<T> copy = (List<T>) in.readObject();
return copy;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
- 使用 clone 方法:如果集合中的元素类实现了 Cloneable 接口,并且正确地重写了 clone() 方法,那么可以通过调用 clone() 方法来实现深拷贝。
import java.util.ArrayList; import java.util.List;
// 实现 Cloneable 接口
class MyClass implements Cloneable { // ...
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
// 深拷贝方法
public static copy = new ArrayList<>(); for (T item : source) { try { @SuppressWarnings("unchecked") T clonedItem = (T) item.clone(); copy.add(clonedItem); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } return copy; }
- 使用第三方库:如果你不想自己实现深拷贝的逻辑,可以使用一些第三方库,如 Apache Commons Lang 的 SerializationUtils 类或 Google Guava 的 Lists 类提供的方法来实现深拷贝。
import org.apache.commons.lang3.SerializationUtils;
import com.google.common.collect.Lists;
// 深拷贝方法(使用 Apache Commons Lang)
public static <T extends Serializable> List<T> deepCopy(List<T> source) {
return SerializationUtils.clone(source);
}
// 深拷贝方法(使用 Google Guava)
public static <T extends Serializable> List<T> deepCopy(List<T> source) {
return Lists.newArrayList(source);
}
在进行深拷贝时,集合中的元素类必须是可序列化的或实现了 Cloneable 接口,并正确地重写了 clone() 方法。另外,深拷贝可能会导致性能损耗,因此在处理大型集合时要谨慎使用。朋友们觉得好用记得点赞
标签:java,clone,List,几种,source,return,拷贝,序列化 From: https://blog.51cto.com/u_15989193/8909893