【发布时间】:2012-10-10 18:48:35
【问题描述】:
我精通 ArrayList 和 LinkedList 的优缺点。 ArrayList 是随机访问的首选,当添加和删除较少时,反之亦然。如果我需要一个既需要随机访问又需要经常从列表中添加和删除项目的数据结构怎么办?
选择哪一个?
【问题讨论】:
-
@BheshGurung 我不知道该怎么评价你的评论?
标签: java collections arraylist linked-list
我精通 ArrayList 和 LinkedList 的优缺点。 ArrayList 是随机访问的首选,当添加和删除较少时,反之亦然。如果我需要一个既需要随机访问又需要经常从列表中添加和删除项目的数据结构怎么办?
选择哪一个?
【问题讨论】:
标签: java collections arraylist linked-list
这些数据结构与 API 兼容,只需对您的代码进行基准测试/分析即可。
另一个提示:使用ArrayList 假设您执行N 查找和N 突变。这总计为O(N) + O(N * N) <=> O(N^2) 复杂度。使用LinkedList,您将获得O(N*N) + O(N) <=> O(N^2)(线性查找时间N + 恒定时间突变时间N)。所以这两种数据结构是可比的。
如果您愿意更深入地了解兔子洞,scala.collection.immutable.Vector 具有查找和插入/删除的 amortized constant cost。它是不可变的,因此是线程安全的!它是在底层使用一些复杂的数据结构来实现的。
【讨论】:
如果你想随机访问 ArrayList,你可以将它用作普通列表并添加/删除项目。
ArrayList 的内存是按块分配的,除非您的 ArrayList 变得巨大,否则内存可能会耗尽。
由于你没有提到你是否有任何内存限制(唯一的限制是随机访问),我会说 ArrayList 应该满足你的所有需求。
【讨论】:
ArrayList 的内存需求小于LinkedList 的内存需求。这是因为ArrayList 只有一个包含数组的对象,而LinkedList 将需要每个列表元素一个额外的对象来表示链接。但这里的内存似乎不是问题。