首页 > 解决方案 > 创建多级列表的深层副本?

问题描述

我有:

ArrayList<ArrayList<ArrayList<Task>>> optimalPaths = new ArrayList<ArrayList<ArrayList<Task>>>();

我想创建一个最优化路径的深层副本。副本本身不应包含对最佳路径的任何引用。下面的代码会起作用吗?

ArrayList<ArrayList<ArrayList<Task>>> altPaths = new ArrayList<ArrayList<ArrayList<Task>>>();

for (ArrayList<ArrayList<Task>> e : optimalPaths){
    altPaths.add((ArrayList<ArrayList<Task>>) e.clone()); // Create deep copy of optimalPaths
}

我不确定在 altPaths 中是否仍然存在某种程度的引用。

标签: javadeep-copy

解决方案


如果 Task 类没有任何要复制的瞬态​​字段,则可以通过序列化和反序列化使用复制:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(optimalPaths);

ByteArrayInputStream bis = new   ByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
ArrayList<ArrayList<ArrayList<Task>>> copied = (ArrayList<ArrayList<ArrayList<Task>>>) in.readObject();

或使用外部类来做到这一点:来自 Apache Commons 的 SerializationUtils


推荐阅读