Каждый, кто ответил здесь, прав. Все они правы в своем понимании того, что это очень сильно зависит от вашего шаблона использования, то есть не существует единого списка, который подходит всем. Но в момент моего написания они все забыли упомянуть (или это, или я неаккуратный читатель) случай использования, когда LinkedList в лучшем случае: вставка с итератором. Это означает, что если вы делаете не просто
LinkedList::add(int index, E element)
Inserts the specified element at the specified position in this list.
, который, похоже, использовался для получения статистики, но
iterator.insert(E element)
с iterator
, полученным через
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.
или
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 () и удаления () - они все равно будут O (n) ... И не для вставки TreeList () и удаления () - затраты на балансировку дерева - это не то, чего вы можете избежать ... И TreeList вероятно, у меня больше памяти ... Вы поняли мою идею. Чтобы подвести итог всего этого, LinkedList предназначен для небольших высокопроизводительных сканирующих операций над списками. Нужен ли вам этот вариант использования или нет - только вы можете сказать.
PSS. Тем не менее, поэтому я тоже остаюсь
соблазнились сделать вывод, что они
амортизируется или игнорируется ArrayList's
растущие боли, и не приняли во
рассмотрение вставки и
время удаления для элемента в
LinkedList, который уже был
расположен.