java - 如何最有效地将列表内容复制到另一个列表
问题描述
我有 2 个包含重物的大列表,我需要将它们加入一个列表。我的第一直觉是创建一个新列表并将这两个列表的内容附加到其中,如下所示:
List<Item> items = new ArrayList<>();
items.addAll(list1);
items.addAll(list2);
但是,由于这是一个 ArrayList 为了复制这两个大列表,我需要分配新内存而不是使用现有的一次并复制引用。
我现在的想法是使用 LinkedList 并将结束节点复制list1
到头部list2
但是我可以从文档中说没有这样的方法。
有没有更好的方法来连接 2 个列表而不重新分配新内存?如果不是,在这种情况下最好的做法是什么?
解决方案
这可能是最有效的内存/ 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
如果不分配更多内存,就无法连接两个实例。你能做的最好的就是最小化分配。
另一方面......如果您准备实现自己的链表数据结构,则可以通过“拼接”两个列表来将它们连接在一起。但是您的List
API 不允许这种事情。(首先,它破坏了原始列表。)
确实,过早的优化是一件坏事。但是,如果您已经有强有力的证据表明所涉及的列表会很大,那么这可以说还为时过早。
推荐阅读
- angular - 从 Angular 6 调用导入的 javascript
- angular - 初始数据的 TypeScript 可以使用接口类型或类类型哪种方式更好?
- algorithm - 无法理解算法 P146 中最差时间复杂度的证明
- ios - react-native run-ios and xcode build two different apps
- android - Timer resetting again on pressing pause button and not running in background
- ios - Someone else is experiencing an infinite "Waiting" with new iOS 11.4.1?
- c# - AOT 设备中的 Json.Net 反序列化是否需要空构造函数?
- php - I want to combine both result into one in Laravel?
- javascript - What is the proper way to declare a javascript standalone library that works in nodejs, browser, commonJS, and AMD?
- flutter - how to make video_player prepare and start to play quicklier?