ArrayList vs Vector

Hi,

was ist eigendlich der große Unterschied zwischen einem Vector und einer ArrayList?
Wann ist es besser welches zu verwenden?
Was davon verbraucht mehr Speicher?
Was verbraucht mehr Performance und wann?

cu Desian

Hallo Desian,

die Klasse Vektor arbeitet im Gegensatz zur ArrayList mit synchronized-Methoden/Attributen
–> ArrayList ist performanter, aber nicht threadsafe.

Da beide Klassen ansonsten ähnlich implementiert sind, dürfte es sich im Speicher kaum bemerkbar machen, ob man ArrayList oder Vector verwendet.

Gruß
Claudia

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,
Claudia hat das wesentliche schon gesagt. In der Praxis wirst Du eher die ArrayList bevorzugen, da Vector (verständlicherweise) nur methodenweise „synchronized“ ist und diese Granularität häufig nicht ausreichend ist, sondern statt dessen Abfolgen von Methodenaufrufen „synchronized“ sein sollen. Bsp.

if (!myList.contains(element))
{

 myList.add(element);
}

Gruss
Enno

Hi,

Was heisst: nicht threadsafe?
In welchem Fall, kann da was passieren?

cu Desian

Hi,

was heisst: nur methodenweise „synchronized“?
Wenn ich so’n Ding übergebe, ist das doch als Objekt ein ‚Call by referenze‘. dh: es ist das SELBE ArrayList/Vector oder nicht?
Was kann da inerhalb/ausserhalb von Methoden nicht syncronosiert sein?
Was genau kann da negative Flgen haben werden.

Dieses kleine stück Source gefällt mir schon, wenn es so tut. Nur Claudia erwähnte etwas von ‚nicht threadsave‘.

cu Desian

Hallo Desian,

Was genau kann da negative Flgen haben werden.

wenn Du mehrere Threads laufen hast, die mit demselben Vector-Objekt arbeiten, mußt Du sicherstellen, daß die Threads nicht gleichzeitig dieses Objekt abfragen oder ändern.

Das Beispiel von Enno zeigt die Problematik:

if (!myList.contains(element)){

myList.add(element);
}

Nimm an, Du hast 2 Threads, A und B.
Thread A durchläfuft obigen Code. Fragt zunächst, ob „myList“ das Objeket „element“ enthält, tut etwas, um anschließend das Objekt „element“ einzufügen (in der Annahme, daß „element“ in „myList“ nicht enthalten ist).

Nun kommt Thread B, der, während sich Thread A noch in dem Abschnitt „“ befindet, das Objekt „element“ in „myList“ bereits einfügt. Thread A wird dann nochmals „element“ einfügen - und das wäre dann ein Fehler --> nicht threadsafe…

Gruß
Claudia

Hi,

hab ich das dann richtig interpretiert:
Ein Vector ist nicht threadsave.
Umkehrschluss: Eine Liste ist threadsave.

dh: alle Threads nutzen den selben Speicher für den Vector.
Aber: Bekommt jeder Thread für die List eigenen Speicher zugewiesen oder gibt es eine r/w-Sperre, die ein Thread setzen kann?

cu Desian

Hallo Desian,

nein, leider hast Du das nicht richtig verstanden.

Auch bei mehreren Threads hat ein und dasselbe Objekt denselben Speicher - egal ob Liste oder Vector oder sonstwas…

„Threadsafe“ hat mit der Synchronisierung der Zugriffe auf ein Objekt zu tun. Methoden, die auf ein Objekt zugreifen, das in mehreren Threads verwendet wird, müssen synchronisiert werden - d.h. das „synchronized“-Schlüsselwort verwenden.
Die Methoden innerhalb von Vektor tun dies, die von ArrayList nicht
–> Vektor ist threadsafe, ArrayList nicht.

Wie Enno bereits bemerkte, reicht das aber häufig nicht aus, da der Zugriff auf Objekte meist im Kontext gesehen werden muß und die Synchronisierung von Vektor betrifft nur die einzelnen Methoden. Werden diese aber kombiniert (z.B. erst .contains(.), dann .add(.)), dann kann es trotz der Synchronisierung der Vektor-Methoden notwendig sein, selber für eine Synchronisierung zu sorgen!

Mit „synchronized“ verhinderst Du, dass auf das synchronisierte Objekt
gleichzeitig von mehreren Stellen aus zugegriffen wird, d.h. es wird beim Zugriffsversuch des zweiten Threads (von der VM) gewartet, bis der synchronisierte Code vom ersten Thread verlassen wird.

Meine Erklärung ist sehr knapp, daher hier ein link auf ein recht übersichtliches Dokument, welches das Thema Threads betrifft (und auch die Synchronisation beschreibt):
http://www.isbiel.ch/~due/ndit/i-jav.1/99/slides/thr…

Gruß
Claudia

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

Ahh… Verstehe!
Danke!

cu Desian