Java Collection Framework
Willemers Informatik-Ecke
Generics Java ArrayList

In einem Programm werden oft mehrere Exemplare einer Klasse verarbeitet. Diese werden in Datenstrukturen verwaltet. Als einfachstes Beispiel wird das Array verwandt.

Java bietet mit dem Java Collection Framework eine Reihe von Datencontainern an, die über die Fähigkeiten des Arrays hinausgehen. Hinzu kommen einige Funktionsbibliotheken, die unglücklicherweise Algorithmen genannt werden. Hintergrund für den Namen soll wohl die Analogie zu dem Buch Algorithmen und Datenstrukturen von Niklaus Wirth darstellen.

Interfaces

Die grundlegenden Fähigkeiten der Collections werden durch ein Interface festgelegt.

Collection

Die Basis der Interfaces des Java Collection Frameworks bildet das Interface Collection. Hier werden die abstrakten Methoden wie Hinzufügen (add), Entfernen (remove) oder Löschen (clear) deklariert, die dann später implementiert werden müssen.

Iteratoren

Die Iteratoren können als Zeiger auf die Elemente der Datenstruktur angesehen werden und ermöglichen das Durchlaufen jeder Collection, gleich welcher Art.

List

Das Interface List erweitert Collection und fügt der Collection die Eigenschaft hinzu, eine Reihenfolge zu haben. Damit kann per Index ein bestimmtes Element geholt oder gesetzt werden. Auch der Iterator an eine spezielle Stelle gesetzt werden.

Die wichtigsten Implementierungen von List sind

Queue

Eine Queue ist eine Schlange. Auf der einen Seite werden Elemente hineingefügt und auf der anderen Seite werden die Elemente entnommen. Für die Implementierung verwendet man am liebsten LinkedList. Diese implementiert sowohl das Interface List als auch das Interface Queue.

Set

Ein Set ist eine Menge. Hier ist nicht der schnelle Zugriff gefragt. Der besondere Wert einer Menge ist, dass keine doppelten Elemente enthalten sind.

Map

Das Interface Map stellt einen assoziativen Speicher zur Verfügung. Über einen Schlüssel können Sie direkt auf die zugehörigen Daten zugreifen. Ein einfaches Array verwendet eine ganze Zahl als Index auf den Speicher. Allerdings kann das Array nur ganzzahlige Schlüssel, die bei 0 beginnen und lückenlos aufsteigen. Für alles andere verwendet man besser eine Map.

Die Algorithmen des Java Collection Framework

Die Datenbehälter bringen ihre eigenen Methoden mit. Aber es gibt eine Reihe von Algorithmen, die sich auf alle Datenbehälter anwenden lassen. Beispielsweise eine Sortierung oder das Umdrehen der Reihenfolge. Zu diesem Zweck gibt es Algorithmen, die von der Klasse Collection zur Verfügung gestellt werden.

Typsicherheit durch Generics

In den ersten Varianten der Container wurde Object als Stellvertreter der Elemente verwendet. Der Compiler kann aber so nicht kontrollieren, wenn ein Programmierer versehentlich das Objekt einer anderen Klasse herausholte, als er ursprünglich hineingesteckt hatte. Um die Typsicherheit zu gewährleisten, wurden mit Java 5 die Generics eingeführt.

Ohne Generics verwalten die Collections einfach Objekte vom Typ Object. Da Object die Mutter aller Klassen sind, dürfen auch verschiedene Objekte hineingesteckt werden. Beim Herausholen der Objekte muss gecastet werden und es liegt in der Verantwortung des Programmierers, ob er das richtig macht.

private class Datum {
    int jahr, monat, tag;
    Datum(int j, int m, int t) {
        jahr=j; monat=m; tag=t;
    }
}

// ...

ArrayList feld = new ArrayList();
feld.add(new Datum(1960,4,24));
feld.add(new Datum(1969,3,17));
feld.add("Anton ist doof!");  // Das gibt Ärger!
for (int i=0; i<feld.size(); i++) {
   Datum datum = (Datum)feld.get(i);
   System.out.println(datum.jahr);
}
Durch spitze Klammern (Kleiner-, Größerzeichen) kann der ArrayList nun mitgeteilt werden, dass sie Objekte vom Typ Datum verwaltet und nicht einfach Objekte. So kann der Compiler überprüfen, ob das, was rein geht auch wieder rauskommt.

So ist es auch möglich, eine verkürzte for-Schleife speziell für Datenbehälter zu schaffen, die ohne Index einfach alle Elemente der Collection durchläuft.

ArrayList<Datum> feld = new ArrayList<Datum>();
feld.add(new Datum(1960,4,24));
feld.add(new Datum(1969,3,17));
for (Datum datum : feld) {
    System.out.println(datum.jahr);
}

Video


Generics Java ArrayList