要使用哪个List实现?

时间:2010-09-30 13:01:03

标签: java performance memory-management collections

在我的程序中,我经常使用集合来存储对象列表。目前我使用ArrayList来存储对象。 我的问题是:这是最好的选择吗?使用LinkedList可能会更好吗?或其他什么?

要考虑的标准是:

  • 内存使用
  • 性能

我需要的操作是:

  • 将元素添加到集合
  • 遍历元素

有什么想法吗?

更新:我的选择是: ArrayList :)基于此讨论以及以下内容:

8 个答案:

答案 0 :(得分:9)

我总是默认使用ArrayList,在你的情况下也是如此,除非是

  • 我需要线程安全(在这种情况下,我开始查看java.util.concurrent中的List实现)
  • 我知道我将对List进行大量的插入和操作,或者分析显示我对ArrayList的使用是一个问题(非常罕见)

关于在第二种情况下应该选择什么,这个SO.com帖子有一些有用的见解:List implementations: does LinkedList really perform so poorly vs. ArrayList and TreeList?

答案 1 :(得分:0)

链接列表更快地添加/删除内部元素(即不是头部或尾部)

Arraylist迭代速度更快

答案 2 :(得分:0)

这是插入与检索优化之间的经典权衡。您描述的任务的共同选择是ArrayList。

答案 3 :(得分:0)

ArrayList适合您(以及其他大多数)的目的。它具有非常小的内存开销,并且对于大多数操作具有良好的分摊性能。不理想的情况相对罕见:

  • 列表非常大
  • 您经常需要执行以下操作之一:
    • 在迭代期间添加/删除项目
    • 从列表开头删除项目

答案 4 :(得分:0)

如果您只是在列表末尾添加,ArrayList应该没问题。来自ArrayList的文档:

  

除了添加元素具有不变的摊销时间成本这一事实外,未指定增长政策的细节

ArrayList也应该使用比链接列表更少的内存,因为您不需要为链接使用空间。

答案 5 :(得分:0)

这取决于您的使用情况。

你是否添加到列表的末尾?两者都很好。 你是否添加到列表的开头? LinkedList对此更好。 您是否需要随机访问(您是否会在其上调用get(n))? ArrayList对此更好。

两者都擅长迭代,Iterator实现都是next()的O(1)。

如果有疑问,请在每个实施中测试您自己的应用并做出自己的选择。

答案 6 :(得分:0)

我知道我迟到了,但也许,this page可以帮助你,不仅是现在,还有将来......

答案 7 :(得分:0)

根据您的标准,您应该使用LinkedList。

LinkedList实现了Deque接口,这意味着它可以在常量时间(1)中添加到列表的开头或结尾。此外,ArrayList和LinkedList都将在(N)时间内迭代。

您不应该仅仅因为列表已满时添加元素的成本而使用ArrayList。在这种情况下,添加元素将是(N),因为正在创建新数组并将所有元素从一个数组复制到另一个数组。

此外,ArrayList将占用更多内存,因为后备阵列的大小可能无法完全填充。