Vector oder ArrayList - was ist besser?

F: Vector oder ArrayList - was ist besser und warum?

A: Manchmal Vectorist es besser; manchmal ArrayListist es besser; manchmal willst du auch nicht verwenden. Ich hoffe, Sie haben nicht nach einer einfachen Antwort gesucht, da die Antwort davon abhängt, was Sie tun. Es sind vier Faktoren zu berücksichtigen:

  • API
  • Synchronisation
  • Datenwachstum
  • Nutzungsmuster

Lassen Sie uns die einzelnen nacheinander untersuchen.

API

In der Java-Programmiersprache (Addison-Wesley, Juni 2000) beschreiben Ken Arnold, James Gosling und David Holmes das Vectorals Analogon zum ArrayList. Aus API-Sicht sind sich die beiden Klassen also sehr ähnlich. Es gibt jedoch immer noch einige wesentliche Unterschiede zwischen den beiden Klassen.

Synchronisation

Vectorssind synchronisiert. Jede Methode, die Vectorden Inhalt berührt , ist threadsicher. ArrayListAuf der anderen Seite sind sie nicht synchronisiert, was sie daher nicht threadsicher macht. In Anbetracht dieses Unterschieds führt die Verwendung der Synchronisierung zu einem Leistungseinbruch. Wenn Sie also keine thread-sichere Sammlung benötigen, verwenden Sie die ArrayList. Warum den Preis für die Synchronisation unnötig bezahlen?

Datenwachstum

Intern halten sowohl die ArrayListals auch Vectorihre Inhalte mit einem Array. Sie müssen diese Tatsache berücksichtigen, wenn Sie eines Ihrer Programme verwenden. Wenn Sie ein Element in ein ArrayListoder ein einfügen Vector, muss das Objekt sein internes Array erweitern, wenn der Platz knapp wird. A Vectorverdoppelt standardmäßig die Größe seines Arrays, während dasArrayListerhöht die Array-Größe um 50 Prozent. Abhängig davon, wie Sie diese Klassen verwenden, können Sie beim Hinzufügen neuer Elemente einen großen Leistungseinbruch erleiden. Es ist immer am besten, die anfängliche Kapazität des Objekts auf die größte Kapazität einzustellen, die Ihr Programm benötigt. Durch sorgfältiges Einstellen der Kapazität können Sie vermeiden, die Strafe zu zahlen, die erforderlich ist, um die Größe des internen Arrays später zu ändern. Wenn Sie nicht wissen, wie viele Daten Sie haben, aber die Wachstumsrate kennen, hat Vectordies einen leichten Vorteil, da Sie den Inkrementwert festlegen können.

Nutzungsmuster

Sowohl das ArrayListals auch Vectoreignen sich zum Abrufen von Elementen von einer bestimmten Position im Container oder zum Hinzufügen und Entfernen von Elementen am Ende des Containers. Alle diese Operationen können in konstanter Zeit ausgeführt werden - O (1) . Das Hinzufügen und Entfernen von Elementen an einer anderen Position erweist sich jedoch als teurer - linear, um genau zu sein: O (ni), wobei n die Anzahl der Elemente und i der Index des hinzugefügten oder entfernten Elements ist. Diese Operationen sind teurer, da Sie alle Elemente bei Index i und höher um ein Element verschieben müssen. Was bedeutet das alles?

Wenn Sie Elemente indizieren oder Elemente am Ende des Arrays hinzufügen und entfernen möchten, verwenden Sie entweder a Vectoroder an ArrayList. Wenn Sie noch etwas mit dem Inhalt tun möchten, suchen Sie sich eine andere Containerklasse. Zum Beispiel kann der LinkedListein Element an jeder Position in konstanter Zeit hinzufügen oder entfernen - O (1). Die Indizierung eines Elements ist jedoch etwas langsamer - O (i) wobei i der Index des Elements ist. Das Durchlaufen von ArrayListist auch einfacher, da Sie einfach einen Index verwenden können, anstatt einen Iterator erstellen zu müssen. Das LinkedListerstellt auch ein internes Objekt für jedes eingefügte Element. Sie müssen sich also des zusätzlichen Mülls bewusst sein, der entsteht.

Schließlich schlägt Peter Haggar in "PRAXIS 41" von Practical Java (Addison-Wesley, Februar 2000) vor, anstelle von Vectoroder ArrayList- insbesondere für leistungskritischen Code - ein einfaches altes Array zu verwenden. Durch die Verwendung eines Arrays können Sie Synchronisation, zusätzliche Methodenaufrufe und suboptimale Größenänderung vermeiden. Sie zahlen nur die Kosten für zusätzliche Entwicklungszeit.

Erfahren Sie mehr über dieses Thema

  • Die Java-Programmiersprache Ken Arnold, James Gosling und David Holmes (Addison-Wesley, Juni 2000; ISBN0201704331)

    //www.amazon.com/exec/obidos/ASIN/0201704331/javaworld/

  • Praktisches Java Peter Haggar (Addison-Wesley, Februar 2000; ISBN0201616467)

    //www.amazon.com/exec/obidos/ASIN/0201616467/javaworld/

  • Mehr wollen? Den vollständigen Q & A-Katalog finden Sie im Java Q & A- Index

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Seit mehr als 100 interessanten Java - Tipps von einigen der besten Köpfe im Geschäft, Besuch Javaworld‘ s Java Tipps Index

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Melden Sie sich für den kostenlosen wöchentlichen E-Mail-Newsletter von JavaWorld This Week an, um zu erfahren, was es Neues bei JavaWorld gibt

    //idg.net/jw-subscribe

Diese Geschichte "Vector oder ArrayList - was ist besser?" wurde ursprünglich von JavaWorld veröffentlicht.