【问题标题】:Java copying using built in LinkedList使用内置 LinkedList 进行 Java 复制
【发布时间】:2011-07-29 14:20:18
【问题描述】:

我有一个关于复制LinkedList 的问题。我正在从事一个项目,该项目正在接收数据并将其存储在LinkedList 中。这是通过网络端口的实时提要完成的,我希望能够将此列表中的数据复制到另一个列表中,以便处理收集的数据。由于总是有数据被收集,有没有像 C 语言那样更改“指针”的方法,以便第一个列表的头部现在与第二个 LinkedList 相关联,因为第一个列表对于新数据将是空的?

【问题讨论】:

    标签: java list linked-list copy live


    【解决方案1】:

    在我看来,您需要的是 2 个队列。有 1 个用于收集的队列和 1 个用于处理的队列。在某些时候,您需要来回交换它们。只要您短暂锁定开关,一切都应该没问题。链表上的指针不用乱搞,可以避免复制内容。

    话虽如此,也许您应该考虑查看在队列之外工作的执行器的并发包。在不太了解您的具体任务的情况下,这些似乎更适合您正在做的事情,并且可以让您避免手动编写细节代码。

    编辑:这是我正在谈论的包。 http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/package-summary.html

    【讨论】:

    • 我正在考虑这个问题,到目前为止,这可能是该问题的最佳答案。我会调查你链接的包。谢谢!
    【解决方案2】:
    second.addAll(first);
    first.clear();
    

    【讨论】:

    • 你知道addAll()的时间复杂度吗?由于我正在接收数据,我担心 addAll() 会花费 x 时间,在 x 时间内将 y 数量的数据添加到第一个链表中,并且使用 clear() 会导致 y 数量的数据丢失。
    • 看起来像 addAll 调用要添加的集合上的 toArray,然后遍历数组,一一添加元素。
    • 不幸的是,复杂度将是O(n),因为无法检索LinkedList 中的底层节点结构。但是,如果性能确实是个问题,我建议您编写自己的支持串联的 LinkedList 实现。
    • 当它调用 toArray 时,这个调用会是深拷贝吗?
    • 我想要一个深拷贝,就像我说的那样我担心并发。有没有办法扩展 Linked List 类来添加必要的方法?
    【解决方案3】:

    其中一个呢:

    linkedlist.push(newHeadValue);

    linkedlist.addFirst(newHeadValue);

    linkedlist.add(0,newHeadValue);

    或者您是否明确想要一个头部没有数据的步骤?

    【讨论】:

    • 我不需要头部为空的步骤。我只需要将数据复制到另一个链表。我最担心的是并发。
    • 申请。我不明白你想最终得到 2 个共享尾部的列表的问题。
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2018-12-02
    • 2016-12-23
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多