每个在这里回答的人都是正确的。他们都认为他们的观点是正确的,这很大程度上取决于你的使用模式,即没有一个通用的列表。但是在写作的那一刻,当LinkedList处于最佳状态时,他们都忘记提及(或者说,或者我是草率的阅读器)用例:迭代器定位插入。这意味着,如果你正在做不只是
LinkedList::add(int index, E element)
Inserts the specified element at the specified position in this list.
这似乎是他们曾经获得的统计方法,但
iterator.insert(E element)
通过两种
public abstract ListIterator<E> listIterator(int index)
Returns a list-iterator of the elements in this list (in proper sequence), starting at the specified position in the list.
获得
iterator
或
public Iterator<E> iterator()
Returns an iterator over the elements in this list (in proper sequence).
,那么你一定会得到最好的任意插入性能。这意味着你可以限制对iterator()和listIterator()的调用次数,以及遍历列表中迭代器的移动次数(例如,你只需要在列表中做一个顺序遍历来完成你需要的所有插入操作)。这使得它的用例在数量上非常有限,但它们却是非常频繁出现的用例。而LinkedList在其中的表现就是为什么它将会保留在所有语言的所有容器集合中,而不仅仅是Java。
PS。上述所有过程当然适用于所有其他操作,如get(),remove()等。通过迭代器精心设计的访问将使所有这些操作都具有非常小的实际常量O(1)。当然,对于所有其他列表也可以这样说,即迭代器访问会加快它们的速度(无论如何略微)。但不是ArrayList的insert()和remove() - 它们仍然是O(n)...而不是TreeList的insert()和remove() - 树平衡开销并不是你可以避免的...并且TreeList可能有更多的内存开销...你明白我的想法。综上所述,LinkedList适用于列表中的小型高性能扫描类操作。无论这是否是您需要的用例 - 只有您可以告诉。
PSS。这就是说,因此我也仍然
倾向于认为他们有 摊销或忽略的ArrayList的 成长的烦恼,并没有考虑到 考虑插入和 去除次项目的 LinkedList的是已经被定位为 。
我在猜测,树形结构是由基于索引的平衡(可能是红黑色)树实现支持的。这肯定会让treelist速度很快,但我不知道在平衡大型列表时,它会产生什么影响。我认为你对他们是正确的,忽略了ArrayList初始化和重新调整大小的问题。 – Thimmayya 2009-11-11 05:31:50