【问题标题】:Is there a way to copy a doubly LinkedList in Java without reference?有没有办法在Java中复制一个双重LinkedList而不参考?
【发布时间】:2009-05-17 00:03:02
【问题描述】:

我正在创建一些 Double 类型的双向链表,无论我如何声明另一个相同类型的链表,它总是引用第一个列表。

如:

LinkedList<LinkedList<Double>> trainingData = new LinkedList<LinkedList<Double>>();
LinkedList<LinkedList<Double>> newData = new LinkedList<LinkedList<Double>>();

在 trainingData 中添加一些东西...

newData = trainingData;  

然后在 newData 中更改此分配后我对 trainingData 所做的任何更改。我还尝试在 newData 的构造函数中传递 trainingData 并使用嵌套循环将 trainingData 的数据分配给 newData,但它仍然给我与 newData 引用 trainingData 相同的结果。

【问题讨论】:

    标签: java copy linked-list


    【解决方案1】:

    您需要在列表中进行迭代并将每个元素复制/克隆到新列表中。

    您面临的问题是 LinkedList 仅保留对其包含的元素的内部引用。当您将列表 a 复制到列表 b 时,您真正要做的是将列表 a 中的引用复制到列表 b,因此对原始列表的任何更改都会反映到新复制的列表。

    【讨论】:

    • 这是对的。 newData = trainingData 导致 newData 和 trainingData 保存对同一列表的引用(最初分配给 trainingData 的列表)。它不会/不/导致分配新的列表副本(或新的列表元素)。
    • 还要注意手动迭代是非常必要的,因为在linkedList实例上调用clone()是不够的,因为它只是做一个浅拷贝:java.sun.com/javase/6/docs/api/java/util/…
    • @Stephen202:可能够也可能不够,取决于列表的内容;如果它们是不可变对象,那么浅拷贝不仅很好,而且是首选,因为克隆不可变对象会浪费 CPU 和内存。
    • 在他的示例中,他使用的是不可变的 Doubles,因此不需要克隆它们。即使在使用可变对象时,有时也需要浅拷贝。 (事实上​​,如果你发现自己做了很多深拷贝,那么考虑一下你的整体设计是否有问题可能是有意义的。)
    【解决方案2】:

    这只是复制对列表的引用,而不是其内容。

    newData = trainingData;
    

    你似乎需要一个深拷贝,比如

    newData = new LinkedList();
    for(LinkedList ll: trainingData)
      newData.add(ll.clone());
    

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 2018-02-04
      • 2021-08-25
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2022-12-05
      相关资源
      最近更新 更多