Weiter zum Inhalt

08.03 Die List-Schnittstelle

Aus dem letzten Kapitel kennen Sie bereits die Collection-Schnittstelle. Das Interface java.util.List (nachfolgend als List oder Liste bezeichnet, und nicht zu verwechseln mit der Klasse java.awt.List) erbt von Collection und spezifiziert java.util.Collection somit genauer.

Allgemeines zu Listen

Ebenso wie die Collection-Schnittstelle, enthält auch eine List mehrere Objekte eines bestimmten Datentyps. Wird dieser Datentyp nicht über Generics definiert, sind auch unterschiedliche Datentypen in einer Liste möglich. Dieser Zustand sollte allerdings nach Möglichkeit vermieden werden. Die Art, wie die Elemente in einer List “liegen”, ist genauer spezifiziert als in der Collection:

  • Eine Liste ist sortiert. Das bedeutet, dass jedes Objekt in einer Liste über einen Index (wie bei einem Array) angesprochen werden kann. Dies funktioniert bspw. mit der Methode list.get(index);. Durch die Sortierung ist auch sichergestellt, dass die Liste zur Laufzeit nicht einfach die Position, also den Index, der Objekte verändern darf/kann.
  • Doppelte Einträge sind erlaubt. So können mehrere identische Objekte (o1.equals(o2);) in eine Liste eingefügt werden. Falls die Liste das Hinzufügen von null gestattet, können typischerweise auch mehrere null-Objekte hinzugefügt werden. Natürlich ist es nicht auszuschließen, dass eine List das Einfügen von doppelten Einträgen durch Werfen einer Exception unterbindet.
  • Ebenso wie Arrays, fangen Listen bei 0 an zu zählen. Der erste Index ist also 0, der Zweite 1, der Dritte 2, …
  • Zusätzlich zum Iterator im Collection-Interface, stellt eine List auch einen ListIterator zur Verfügung. Ein ListIterator erlaubt es Objekte hinzuzufügen und zu ersetzen, und stellt eine Funktionalität bereit, um bidirektional auf ihn zuzugreifen.

Ansonsten zählt natürlich alles, was für eine Collection auch zählt. Somit ist eine List am ehesten mit einem dynamischen Array zu vergleichen.

Methoden einer List (zusätzlich zu den Methoden von java.util.Collection)

  • add(int index, E element) – fügt das Objekt an der spezifischen Stelle in der Liste ein. Das Element, das sich zuvor an dieser Stelle befand, und alle nachfolgenden Elemente, werden um jeweils eine Stelle weiter nach rechts verschoben (aus 3 wird 4, aus 4 wird 5, aus 5 wird 6, …)
  • addAll(int index, Collection<? extends E> c) – fügt die Collection c an der spezifizierten Stelle in die Liste ein. Das Element an dieser Stelle und alle darauffolgenden Elemente, werden um die Größe von c nach rechts verschoben.
  • get(int index) – gibt das Objekt an Stelle index zurück.
  • indexOf(Object o) – gibt die Stelle zurück, an der sich das gegebene Objekt befindet. Falls sich das Objekt nicht in der Liste befindet, gibt diese Methode -1 zurück.
  • lastIndexOf(Object o) – so wie indexOf(Object o), nur, dass die Stelle des letzten Objekts, das gleich o ist, zurückgegeben wird.
  • listIterator() – gibt einen ListIterator für diese Liste zurück.
  • listIterator(int index) – gibt einen ListIterator für diese Liste zurück, der an der Stelle index beginnt.
  • remove(int index) – entfernt das Objekt an der Stelle index von der List.
  • set(int index, E element) – überschreibt das Objekt an der Stelle index mit dem Objekt element.
  • subList(int fromIndex, int toIndex) – gibt eine Liste mit den Elementen in der Liste fromIndex (inklusiv) bis toIndex (exklusiv) zurück.

Verwendung

Java bietet bereits mehrere Implementierungen einer List. Die Wichtigsten werden im Kapitel 08.06 Implementierungen von List vorgestellt. An dieser Stelle folgt noch ein kleines Beispiel mit einer java.util.ArrayList, die Sie im Java Blog Buch bereits mehrmals verwendet haben.

List<String> myList = new ArrayList<String>();
myList.add("String eins");
myList.add("String zwei");
myList.add("String drei");
for (String str : myList) {
  System.out.println(str);
}
List<String> myList2 = new ArrayList<String>();
myList2.addAll(myList);
myList2.remove("String eins");
myList2.remove(1);
for (String str : myList2) {
  System.out.println(str);
}
System.out.println(myList.get(0));

{ 2 } Comments

  1. Daniel | 10. August 2010 um 17:21 | Permalink

    Hallo,

    ich habe gerade leidvoll erfahren, dass eine ArrayList nur die Referenzen bzgl. der mit der add()-Methode hinzugefügten Objekte “beinhaltet”. Nun würde ich gerne in einer Schleife int[]-Arrays als Elemente einer ArrayList bestimmen und dieser ArrayList hinzufügen. Leider werden in den “Update-Berechnungen” innerhalb der Schleife über die einzelne Referenz auf das int[]-Array natürlich alle “Objekte der ArrayList” geändert. Wie kann man das verhindern?

    Viele Grüße
    Daniel

  2. Stefan Kiesel | 10. August 2010 um 18:32 | Permalink

    Hallo Daniel,

    Sie könnten bspw. eine Wrapper-Klasse verwenden, die lediglich ein Attribut – nämlich ein int-Array – enthält. Dieses fügen Sie dann anstelle des eigentlichen int-Arrays der ArrayList hinzu, und aktualisieren dieses auch entsprechend.

    Falls noch etwas unklar ist, oder ich Sie falsch verstanden haben sollte, können Sie gerne noch einmal nachfragen.

    Grüße
    Stefan

Kommentar verfassen

Dein E-Mail wird nicht veröffentlicht oder weitergegeben. Pflichtfelder sind mit * markiert.
*