ArrayList oder LinkedList?

Status
Nicht offen für weitere Antworten.

Novanic

Bekanntes Mitglied
Hi Leute,

bisher habe ich eigentlich immer konsequent ArrayList verwendet. Nun habe ich aber erfahren, dass die LinkedList bei Hinzufügen/Entfernen performanter, im Direktzugriff aber langsamer sein soll. Gilt der Direktzugriff nur für die Methode "Object get(Object o)" oder auch für den Iterator?

Wäre es dann sinnvoll auf die LinkedList umzusteigen, wenn ich nur den Iterator verwende oder gibt es noch performantere Collections als ArrayList und LinkedList?

Danke schonmal im Voraus! :)

Gruß Nova
 
S

SlaterB

Gast
jo, bei get wird die Liste von Anfang oder Ende aus durchlaufen,
beim Iterator von Element zu Element gesprungen

was nun das performanteste ist
(z.B. Vergleich ArrayList get(i) <-> LinkedList Iterator)
ist müßig herauszufinden,
wenn dir was daran liegt, dann teste es selber ;)
(eine Frage hier ist natürlich berechtigt)

wichtiger erscheint mir, die LANGSAMEN Stellen zu umgehen,
also nicht große LinkedList mit get(i) durchlaufen und auch nicht in ArrayList ständig einfügen/ entfernen,
wenn man das richtig gemacht hat, müsste man doch >90% der Performanz erreicht haben, der Rest ist nicht mehr so wichtig

(Meinung, kein Wissen ;) )
 

byte

Top Contributor
Das musst Du von Fall zu Fall entscheiden, welche dieser Listen besser ist. ArrayList wird intern durch ein Array realisiert und hat somit schnellere Zugriffszeiten. Als Konsequenz bedeutet das aber, dass das interne Array zunächst eine feste Maximalgröße bekommt. Wenn Du jetzt immer mehr Elemente hinzufügst, muss das Array irgendwann intern vergrößert werden. Dann leidet die Performance. Dieses Problem hast Du bei der LinkedList nicht. Die wird halt einfach als verkettete Liste realisiert.

Lange Rede kurzer Sinn: Wenn Du weisst, dass nur maximal n Elemente in der Liste sein werden, dann nimm eine ArrayList. Dabei kannst Du auch schon die maximale Größe mitgeben. Wenn die Anzahl der Elemente in der Liste beliebig ist, dann bietet sich eine LinkedList an.
 

Marco13

Top Contributor
LinkedList:

add: O(1)
remove: O(n)
indexOf: O(n)
get: O(n)

ArrayList:

add: O(1)
remove: O(n)
indexOf: O(n)
get: O(1)


Der einzige relevante Unterschied ist der direkte Zugriff auf ein Element mit "get(index)": Dort ist die ArrayList schneller. Ansonsten ist theoretisch kein Unterschied (und praktisch ist der Unterschied vmtl. vernachlässigbar)

EDIT: Ark hatte Recht, die Zeiten bei "get" waren vertauscht (im abschließenden Satz stand's dann aber richtig)
 
S

SlaterB

Gast
zumindest das
LinkedList:
remove: O(n)
finde ich doch recht fraglich,
müssen nicht einfach zwei Referenzen aktualisiert werden?

gut, die Position muss gefunden werden, aber fällt das nicht an dieser Stelle weniger ins Gewicht als das Kopieren bei
ArrayList:
remove: O(n)
?

kommt natürlich immer drauf an, wie man die Elemente bestimmt, an welche Stelle sie stehen usw.,
ein Beispiel von mir:

Code:
public class Test2
{
    public static void main(String[] args)
        throws Exception
    {
        ArrayList<Integer> zahlen = new ArrayList<Integer>(1000);

        ArrayList<Integer> a = new ArrayList<Integer>(1000);
        LinkedList<Integer> l = new LinkedList<Integer>();
        for (int i = 0; i < 1000; i++)
        {
            Integer integer = Integer.valueOf(i);
            zahlen.add(integer);
            a.add(integer);
            l.add(integer);
        }
        Collections.shuffle(zahlen);

        testRemove(l, zahlen);
        testRemove(a, zahlen);
        testRemove(l, zahlen);
        testRemove(a, zahlen);
    }


    public static void testRemove(List<Integer> l, List<Integer> zahlen)
    {
        long time = System.currentTimeMillis();
        Integer integer = null;
        for (int i = 0; i < 10000; i++)
        {
            for (int j = 0; j < 1000; j++)
            {
                integer = zahlen.get(j);
                l.remove(integer);
                l.add(integer);
            }
        }
        long diff = System.currentTimeMillis() - time;
        System.out.println("time: " + diff + ", for List: " + l.getClass().getSimpleName());
    }
}
->
time: 813, for List: LinkedList
time: 10859, for List: ArrayList
time: 766, for List: LinkedList
time: 10860, for List: ArrayList
 

Marco13

Top Contributor
Ja, das Kopieren bei remove benötigt natürlich Zeit - genauso wie das Vergrößern des Arrays bei "add". Trotzdem ist die Zeit asymptotisch linear. (Wenn beim Einfügen die Kapazität immer um 1 erhöht werden würde, hätte das Einfügen von n Elementen z.B. auch eine Quadratische Laufzeit). Aber schließlich müssen bei einem remove aus einer Liste mit n Elementen höchstens n Elemente kopiert werden, und damit ist und bleibt es O(n). Dass in der Praxis der konstante Faktor relevant sein kann, sollte man vielleicht nochmal hervorheben.

Und wie repräsentativ/verläßlich dein Testprogramm (mit add und remove!) ist, ist eine andere Frage... :wink:
Code:
import java.util.*;

public class Test2
{
    public static void main(String[] args)
        throws Exception
    {
        ArrayList<Integer> zahlen = new ArrayList<Integer>(10000);

        ArrayList<Integer> a = new ArrayList<Integer>(10000);
        LinkedList<Integer> l = new LinkedList<Integer>();
        for (int i = 0; i < 10000; i++)
        {
            Integer integer = Integer.valueOf(i);
            zahlen.add(integer);
            a.add(integer);
            l.add(integer);
        }
        Collections.shuffle(zahlen);

        testRemove(l, zahlen);
        testRemove(a, zahlen);
        testRemove(l, zahlen);
        testRemove(a, zahlen);
    }


    public static void testRemove(List<Integer> l, List<Integer> zahlen)
    {
        long time = System.currentTimeMillis();
        Integer integer = null;
        for (int i = 0; i < 100; i++)
        {
            for (int j = 0; j < 1000; j++)
            {
                integer = zahlen.get(j);
                l.remove(integer);
                l.add(integer);
            }
        }
        long diff = System.currentTimeMillis() - time;
        System.out.println("time: " + diff + ", for List: " + l.getClass().getSimpleName());
    }
}

Ausgabe:

time: 12407, for List: LinkedList
time: 10875, for List: ArrayList
time: 12593, for List: LinkedList
time: 10891, for List: ArrayList
 
S

SlaterB

Gast
gemein, den Suchaufwand durch die Länge der Liste so hochzutreiben ;)
 

Wildcard

Top Contributor
Solche Tests halte ich für irreführend.
Wer sagt mir denn das der Hot Spot Compiler
Code:
          for (int j = 0; j < 1000; j++)
            {
                integer = zahlen.get(j);
                l.remove(integer);
                l.add(integer);
            }
In VM xy nicht zum wesentlich günstigeren Iterator (dann man immer verwenden sollte) umbaut?
 
S

SlaterB

Gast
meinst du zahlen.get(j)?
das ist doch nicht Bestandteil des Tests,
wenn es umgebaut wird, dann für beide Listen gleich, eh egal
 

Marco13

Top Contributor
Wer sagt mir denn das der Hot Spot Compiler [...] In VM xy nicht zum wesentlich günstigeren Iterator [...] umbaut?

Das sagt einem ein Test, bei dem man den JIT mal abschaltet.

(dann man immer verwenden sollte)

Warum? Jedenfalls ist er beim reinen Durchlaufen langsamer als eine for-Schleife - egal ob mit JIT oder ohne....
 

Wildcard

Top Contributor
Marco13 hat gesagt.:
Warum? Jedenfalls ist er beim reinen Durchlaufen langsamer als eine for-Schleife - egal ob mit JIT oder ohne....
Aber nicht bei einer LinkedList die sequentiell durchlaufen werden soll. Daher sollte man ja immer den Iterator oder die foreach Schleife nehmen, denn wenn man sich an den Grundsatz 'Zum Interface hin zu programmieren' hält, ist die dahinterliegende Implementierung der List in den meisten Fällen unbekannt.
 

Wildcard

Top Contributor
SlaterB hat gesagt.:
meinst du zahlen.get(j)?
das ist doch nicht Bestandteil des Tests,
wenn es umgebaut wird, dann für beide Listen gleich, eh egal
Nicht egal. Die ArrayList wird mit dem Iterator eventuell minimal langsamer, während die LinkedList viel schneller wird.
 
S

SlaterB

Gast
aber zahlen.get(j) ist IMMER eine ArrayList und wird nur nebenbei ZUM Test benutzt,
ist nicht Teil des Tests ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ArrayList oder LinkedList Allgemeine Java-Themen 10
H LinkedList<LinkedList<String>> nach ArrayList<ArrayList<String>> ? Allgemeine Java-Themen 9
C LinkedList und ArrayList in HashMap Allgemeine Java-Themen 4
R ArrayList, LinkedList oder Set Allgemeine Java-Themen 9
F Synchronisation + Vector/ArrayList/LinkedList Allgemeine Java-Themen 7
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
B Type mismatch: cannot convert from Graph.Edge to ArrayList<Graph.Edge> Allgemeine Java-Themen 21
R ArrayList Allgemeine Java-Themen 4
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
J ArrayList, ganze Zeilen löschen oder überspringen Allgemeine Java-Themen 4
L ArrayList sortieren Allgemeine Java-Themen 2
C ArrayList Problem Allgemeine Java-Themen 3
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
S Best Practices CopyConstrutor mit ArrayList Allgemeine Java-Themen 1
S ArrayList Design Allgemeine Java-Themen 4
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
X Adjazenzliste ohne ArrayList Allgemeine Java-Themen 6
X Output von ArrayList Allgemeine Java-Themen 3
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
H Arraylist mit anderer ArrayList überschreiben Allgemeine Java-Themen 17
MiMa ArrayList sortieren?? Allgemeine Java-Themen 5
Curtis_MC Pointer mit ArrayList vergleichen Allgemeine Java-Themen 6
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
F Arraylist vollständig abspeichern und laden Allgemeine Java-Themen 1
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
D ArrayList Indexlänge ändern Allgemeine Java-Themen 2
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
N Mehrdimensionale ArrayList mischen Allgemeine Java-Themen 10
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
MiMa Date aus einer ArrayList<Date> holen ?? Allgemeine Java-Themen 5
MiMa ArrayList Rückgabewerte aus einer Funktion Allgemeine Java-Themen 15
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
T Collections ArrayList Sortieren Allgemeine Java-Themen 4
P GUI: ArrayList anzeigen funktioniert nicht Allgemeine Java-Themen 5
H ArrayList: Leere Elemente finden? Allgemeine Java-Themen 2
GreenTeaYT Verständnisprobleme zur Arraylist Allgemeine Java-Themen 1
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
K ArrayList sortieren Allgemeine Java-Themen 16
A Bestimmte Inhalte aus ArrayList 1 in ArrayList 2 kopieren Allgemeine Java-Themen 6
S Mehrdimensionales ArrayList ins HashSet Allgemeine Java-Themen 10
C ArrayList Allgemeine Java-Themen 8
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
K Array in ArrayList Allgemeine Java-Themen 16
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
Paul15 Arraylist 2D Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
Neumi5694 Datentypen ArrayList vs TreeMap Allgemeine Java-Themen 6
F ArrayList Allgemeine Java-Themen 11
X ArrayList will nicht so wie ich will. Hilfe Allgemeine Java-Themen 8
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
M ArrayList mit verschiedenen Datentypen in String konvertieren Allgemeine Java-Themen 10
Z Elemente einer ArrayList von rechts wegnehmen Allgemeine Java-Themen 5
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
R ArrayList und HashMap Allgemeine Java-Themen 7
T ArrayList zeilenumbruch entfernen Allgemeine Java-Themen 13
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
E ArrayList Anzahl der gleichen Elemente Allgemeine Java-Themen 4
Doopy ArrayList plötzlich leer Allgemeine Java-Themen 2
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7
L ArrayList Inhaltstyp. Allgemeine Java-Themen 5
Z Klassen ArrayList selbst machen Allgemeine Java-Themen 5
J Arraylist speichern und laden? Allgemeine Java-Themen 5
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
D ArrayList index auf gültigkeit prüfen Allgemeine Java-Themen 12
M ArrayList<String> Frage Allgemeine Java-Themen 7
O ArrayList kaputt?! Allgemeine Java-Themen 5
M ArrayList<Foo> in ein Foo[] konvertieren? Allgemeine Java-Themen 8
Bananabert Abstract ArrayList Allgemeine Java-Themen 4
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
O ArrayList - Serialisierungs-Problem Allgemeine Java-Themen 11
M JTable + ArrayList Allgemeine Java-Themen 3
M Datentypen ArrayList in Integer konvertieren Allgemeine Java-Themen 3
O Collections ListIterator gibt Inhalt von ArrayList nicht aus Allgemeine Java-Themen 3
Madlip Variablen 3 Werte aus ArrayList und weiter ... Allgemeine Java-Themen 4
S arraylist nach n. Eintrag numerisch Sortiren Allgemeine Java-Themen 5
O Problem beim Auslesen einer Arraylist von JComboBoxen Allgemeine Java-Themen 2
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
M Kovariante Rückgabewerte mit ArrayList Allgemeine Java-Themen 3
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
Maxim6394 Problem mit ArrayList Allgemeine Java-Themen 5
E Berechnung in Arraylist Allgemeine Java-Themen 10
E ArrayList mit unbekannter Größe Allgemeine Java-Themen 8
V Fork Join bei Arraylist Allgemeine Java-Themen 6
H Fehler in Arraylist Allgemeine Java-Themen 2
S Datensätze in eine ArrayList<Movie> speichern Allgemeine Java-Themen 13
S Alle Kombinationen aus ArrayList - Potenzmenge Allgemeine Java-Themen 7
V ArrayList vergleichen mit .equals? Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben