每個在這裏回答的人都是正確的。他們都認爲他們的觀點是正確的,這很大程度上取決於你的使用模式,即沒有一個通用的列表。但是在寫作的那一刻,當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