【发布时间】:2014-03-27 10:29:45
【问题描述】:
我检查了其他答案,但我找不到我的问题的正确答案。
我想创建我的ArrayList<ArrayList> 的副本,因为我需要其他地方的原始副本。我以不同的方式使用了.clone() 方法:
public class WordChecker {
private ArrayList<ArrayList> copyOfList = new ArrayList<ArrayList>();
public WordChecker(ArrayList<ArrayList> list) {
for (int i = 0; i < list.size(); i++)
for (int j = 0; j < 7; j++)
copyOfList = (ArrayList<ArrayList>) list.clone(); // without error
// copyOfList = list.clone();cannot convert from Object to
// ArrayList<ArrayList>
// copyOfList = list.get(i).clone();cannot convert from Object to
// ArrayList<ArrayList>
// copyOfList = list.get(i).get(j).clone();
}
但我的主要ArrayList 仍然在我处理它的副本时发生变化。
谁能告诉我在这种情况下我应该如何获得深层副本?
答案: 我将复制机制放在我的类构造函数中:
private ArrayList<List> checkedTags = new ArrayList<List>();
public WordChecker(ArrayList<ArrayList> list)
{
for (ArrayList word: list) copyOfList.add((ArrayList) word.clone());
}
唯一的问题是,这不适用于从 ArrayList 复制,这让我经历了一个 for 循环使用 .get() 方法。我觉得它们最后基本相同。
【问题讨论】:
-
不要使用克隆()。使用将另一个集合作为参数的 ArrayList 构造函数。如果你想要一个深拷贝,你需要循环。
-
我创建了一个嵌套循环来访问内部 ArrayList 中的每个项目。它抛出代码前面提到的错误。我使用了以下代码:>> for (ArrayList word: list) copyOfList.add(word.clone())... 也是。但它不能接受 .add .