如何克隆二维列表?

时间:2013-02-03 12:35:39

标签: java list

我想要克隆列表:

public List<List<Test>> a = new ArrayList<List<Test>>();
public List<List<Test>> b = new ArrayList<List<Test>>();

但如果我这样做:

b = (ArrayList<List<Test>>)a.clone();

发生错误:

The method clone() is undefined for the type List<List<Test>>

你能帮助我吗?

4 个答案:

答案 0 :(得分:1)

java.util.List未实现Cloneable,因此编译器无法确保您正在使用的具体实现。因此,它不允许您编写调用可能不存在的方法的代码。

如果你知道具体的实现,你可以投了它。例如,如果它是ArrayList<List<Test>>(因为ArrayList确实实现了Cloneable),那么你做

  b = (List<List<Test>>) ((ArrayList<List<Test>>) a).clone();

如果不这样做,请实施自己的方法。

请记住,默认clone会生成浅层副本。也就是说,返回的对象将是新的List<List<Test>>,但内部List<Test>Test将不会被复制,您将获得对原始对象的引用。

答案 1 :(得分:1)

clone()不适用于摘要列表,仅适用于ArrayList。但是它不会像你期望的那样工作,因为它只返回一个浅拷贝。要进行深层复制,您需要循环克隆:

   for (List<Test> item: a)
      b.add(new ArrayList(item);

答案 2 :(得分:0)

使用构造函数或addAll方法:

new ArrayList<>(a);
//or
b.addAll(a);

答案 3 :(得分:0)

如果您正在使用Java 8,则只需使用流即可使用与上一个相同的对象创建新列表:

List<Double> secondList = firstList.stream().collect(Collectors.toList());

如果你想要一个与第一个没有共享相同对象的新列表,你可以这样做(假设你的对象实现了Cloneable):

如果您正在使用Java 8,则只需使用流即可使用与上一个相同的对象创建新列表:

List<Double> secondList = firstList.stream().collect(Collectors.toList());

如果你想要一个与第一个没有共享相同对象的新列表,你可以这样做(假设你的对象实现了Cloneable):

List<Double> secondList = firstList.stream().map(v -> v.clone()).collect(Collectors.toList());