首页 > 解决方案 > 如何最有效地将列表内容复制到另一个列表

问题描述

我有 2 个包含重物的大列表,我需要将它们加入一个列表。我的第一直觉是创建一个新列表并将这两个列表的内容附加到其中,如下所示:

List<Item> items = new ArrayList<>();
items.addAll(list1);
items.addAll(list2);

但是,由于这是一个 ArrayList 为了复制这两个大列表,我需要分配新内存而不是使用现有的一次并复制引用。

我现在的想法是使用 LinkedList 并将结束节点复制list1到头部list2但是我可以从文档中说没有这样的方法。

有没有更好的方法来连接 2 个列表而不重新分配新内存?如果不是,在这种情况下最好的做法是什么?

标签: javalistarraylist

解决方案


这可能是最有效的内存/ GC 方法:

List<Item> items = new ArrayList<>(list1.size() + list2.size());
items.addAll(list1);
items.addAll(list2);

capacity诀窍是在创建列表时提供准确的信息;请参阅javadoc。这将保存任何双重复制以“增长”目标列表(即list)。

我现在的想法是使用LinkedList并将结束节点复制list1到头部,list2但是我可以从文档中说没有这样的方法。

LinkedList每个列表条目使用的内存比ArrayList. 4 倍或更多。

此外,当您addAll从一个LinkedList到另一个使用时,您正在创建新的列表节点对象。


我有 2 个包含重物的大清单....

对象的重量(大小)不相关。AList包含对对象的引用,而不是对象本身的副本。


有没有更好的方法来连接 2 个列表而不重新分配新内存?

java.util.List如果不分配更多内存,就无法连接两个实例。你能做的最好的就是最小化分配。

另一方面......如果您准备实现自己的链表数据结构,则可以通过“拼接”两个列表来将它们连接在一起。但是您的ListAPI 不允许这种事情。(首先,它破坏了原始列表。)


确实,过早的优化是一件坏事。但是,如果您已经有强有力的证据表明所涉及的列表很大,那么这可以说还为时过早。


推荐阅读