On Wednesday 12 of October 2005 12:53, Tuzinsky Vladimir wrote:
> Po par testoch s ArrayList a LinkedList sa mi zda, ze LinkedList ma vyznam
> iba v pripade, ze potrebujete pridavat prvky inde ako na koniec pola. Vtedy
> ArrayList musi kopirovat koniec pola. Napr.
>
> List list = new ArrayList();
> for (int i = 0; i < 100000; i++) {
> list.add(0, new Integer(i));
> }
>
> trva na mojom stroji viac ako 7s, zatial co to iste s LinkedList len nieco
> cez 100ms. Pri pridavani na koniec pola potrebuje LinkedList asi dva krat
> tolko casu ako ArrayList...
Vysledky techto testu jsou naprosto zrejme a ocekavane a new ArrayList(100000)
by s tim uz asi moc neudelal. Presto mi prijde trojnasobna spotreba pameti
jako velmi zavazny problem (T[] mate mnozinu objektu Entry<T>, ktery ma kazdy
tri odkazy na T) a proto je jeho pouziti u opravdu velkych seznamu v radech
desitek a stovek milionu, na ktere je urcen, trochu omezene. Navic staci
pridat proiterovani celeho seznamu a soucet casu vytvoreni a pruchodu je jiz
lepsi pro ArrayList (a to jiz u listu o delce pouze deset tisic), coz je ale
take naprosto zrejme diky nutnosti projit vsechny prvky od zacatku pro
nalezeni toho spravneho.
Takze vysledek je jasny: LinkedList je vhodny pouze na implementaci obrovskych
front, kde nezalezi na velikosti pameti, kterou to zabere. No a prave
use-case na pouziti takoveto fronty mi chybi. Kvuli frontam o delce v radu
desitek prvku IMHO neni treba impementovat novou tridu ;-)
A use-case emulace prodejny s ovocem a zeleninou z konce osmdesatych let pri
nakupu bananu mi prijde jako hodne umely pripad :-D
--
Oto 'tapik' Buchta, [EMAIL PROTECTED]
Senior Engineer, Systinet Corp,
http://www.systinet.com