Ogni persona che ha risposto qui è corretta. Hanno tutti ragione nel loro concetto, che dipende molto dal tuo schema di utilizzo, cioè non esiste un elenco valido per tutti. Ma al momento della mia scrittura hanno tutti dimenticato di menzionare (o quello, o sono un lettore sciatto) un caso d'uso quando LinkedList è il migliore: inserto posizionato da iteratore.Ciò significa, che se si sta facendo non solo
LinkedList::add(int index, E element)
Inserts the specified element at the specified position in this list.
che sembrano essere il metodo che hanno usato per ottenere le statistiche, ma
iterator.insert(E element)
con una iterator
ottenuta attraverso sia
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.
o
public Iterator<E> iterator()
Returns an iterator over the elements in this list (in proper sequence).
, quindi sei tenuto a ottenere le migliori prestazioni di inserimento arbitrarie di sempre. Ciò implica, naturalmente, che puoi limitare il numero di chiamate a iterator() e listIterator() e il numero di movimenti di iteratore attraverso l'elenco (ad esempio puoi fare un solo passaggio sequenziale sull'elenco per fare tutti gli inserti di cui hai bisogno). Questo rende i suoi casi d'uso abbastanza limitati nel loro numero, ma tuttavia sono quelli che si verificano molto spesso. E la performance di LinkedList in loro è la ragione per cui è (e sarà in futuro) conservata in tutte le raccolte di contenitori di tutte le lingue, non solo di Java.
PS. Tutto quanto sopra naturalmente si applica a tutte le altre operazioni, come get(), remove(), ecc. I.e l'accesso attentamente progettato tramite iteratore renderà tutti loro O (1) con una costante reale molto piccola. Lo stesso naturalmente può essere detto per tutti gli altri elenchi, l'accesso iteratore li velocizzerà tutti (anche se leggermente). Ma non l'inserto() e remove() di ArrayList - saranno ancora O (n) ... E non TreeList's insert() e remove() - l'overhead di bilanciamento dell'albero non è qualcosa che puoi evitare ... E TreeList probabilmente ha più memoria in testa ... Hai la mia idea. Per riassumere tutto, LinkedList è per piccole operazioni di tipo hi-perf-scan sugli elenchi. Che sia il caso d'uso di cui hai bisogno o meno - solo tu puoi dirlo.
PSS. Detto questo, sto quindi rimango anche
tentati di concludere che hanno ammortizzato o ignorati dolori della crescita di ArrayList, e non hanno preso in considerazione volte l'inserimento e di rimozione per un elemento in un LinkedList che è già stato situato.
Immagino che l'elenco delle colonne sia supportato da un'implementazione di albero bilanciata (possibilmente rosso-nero) basata solo sull'indice. Ciò renderebbe sicuramente veloce la lista degli alberi, anche se non so quale effetto abbia nel bilanciare le liste di grandi dimensioni. Penso che tu abbia ragione su di loro ignorando l'inizializzazione di ArrayList e ridimensionando i problemi. – Thimmayya