PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Utilities - praktischer Nutzen


darph
2006-02-16, 15:50:48
Hm... kann mir mal jemand den praktischen Unterschied zwischen LinkedList, Vector und ArrayList erklären?

Okay, Vector ist synchronisiert, aber dann gibt's ja auch noch die SynchronizedList...

Abnaxos
2006-02-16, 16:03:15
Hm... kann mir mal jemand den praktischen Unterschied zwischen LinkedList, Vector und ArrayList erklären?
LinkedList ist eine doppelt verkettete Liste, d.h. die Elemente werden über Referenzen miteinander verknüpft. Doppelt verkettete Listen sind besonders dann geeignet, wenn häufig Elemente hinzugefügt oder entfernt werden, da diese Operationen sehr einfach zu realisieren sind. Dafür sind sie sehr schlecht geeignet, wenn häufig direkt auf Elemente zugegriffen werden soll, da die Liste dafür jeweils durchiteriert werden muss.

ArrayList ist eine Liste, die durch Arrays realisiert wird. Das führt zu sehr schnellem direkten Zugriff auf Elemente, kann aber bei häufigem Einfügen/Entfernen von Elementen auf die Performance gehen, da hier Speicher herumgeschoben werden muss und u.U. das gesamte darunterliegende Array neu erzeugt und kopiert werden muss, wenn das Array zu klein geworden ist, um noch alle Elemente aufnehmen zu können.

Okay, Vector ist synchronisiert, aber dann gibt's ja auch noch die SynchronizedList...
Korrekt. Vector existiert nur noch aus historischen Gründen. Es wurde verwendet, bevor mit Java2 (JDK 1.2) das neue Collections-Framework eingeführt wurde. Du kannst die Existenz dieser Klasse getrost ignorieren.

ethrandil
2006-02-16, 22:27:27
Naja, das mit der LinkedList kann man so einfach auch nicht sagen ;-).
Sie ist nur wirklich schnell, wenn du nahe am Anfang oder Ende was einfügen willst.

Wenn du vorher eine obere Schranke der Elementanzahl hast, kannst du die Arraylist auf die maximale Größe setzen und es wird kein Speicherplatz mehr herumkopiert...

Ansonsten hat mein Vorredner das meiste gesagt.

mfg
- Eth

Xmas
2006-02-17, 01:31:25
Naja, das mit der LinkedList kann man so einfach auch nicht sagen ;-).
Sie ist nur wirklich schnell, wenn du nahe am Anfang oder Ende was einfügen willst.
Kommt natürlich auch drauf an wie eingefügt wird, ob evtl. Elemente gecached werden und ähnliches.

Wenn du vorher eine obere Schranke der Elementanzahl hast, kannst du die Arraylist auf die maximale Größe setzen und es wird kein Speicherplatz mehr herumkopiert.
Es wird kein neuer Speicherplatz mehr benötigt, aber es muss immer noch umkopiert werden wenn du Elemente einfügst oder löschst.

AlSvartr
2006-02-17, 13:39:07
Naja, das mit der LinkedList kann man so einfach auch nicht sagen ;-).
Sie ist nur wirklich schnell, wenn du nahe am Anfang oder Ende was einfügen willst.
Hm, das musste aber mal erklaeren...so wie ich das sehe, hat jedes Element ne "Vorwaerts-" und ne "Rueckwartsreferenz", also jeweils eine Referenz auf Vorgaenger und Nachfolger. Die muss man beim Einfuegen bzw. Loeschen ja nur "umhaengen"...ich seh da nicht den Zusammenhang zwischen Geschwindigkeit und Position des Elements in der Liste, das sollte eigentlich immer in O(1) gehen :S

RoKo
2006-02-17, 14:11:28
Hm, das musste aber mal erklaeren...so wie ich das sehe, hat jedes Element ne "Vorwaerts-" und ne "Rueckwartsreferenz",
Richtig, aber vielleicht hat man das Element, vor oder nach dem eingefügt wird gerade nicht zur Hand und muß es erst raussuchen. Deswegen kommt es drauf an, wie eingefügt wird, wie Xmas schon bemerkte.

AlSvartr
2006-02-17, 14:18:41
Richtig, aber vielleicht hat man das Element, vor oder nach dem eingefügt wird gerade nicht zur Hand und muß es erst raussuchen. Deswegen kommt es drauf an, wie eingefügt wird, wie Xmas schon bemerkte.
Naja...aber das gehoert fuer mich dann schon wieder nicht mehr zum Einfuegen, sondern das ist nochmal eine separate Suche...prinzipiell isses natuerlich richtig, aber wenn man von Einfuegen redet, dann geh ich davon aus, dass man z.b. ein insertBefore(Node n) hat, so dass man direkt auf die Referenzen zugreifen kann.

Naja, kommt wohl drauf an, wie man das betrachten moechte ;)