16.2.2 | Collection Interfaces |
In diesem Abschnitt werden die unterschiedlichen Interfaces kurz beschrieben, die das Collection-Framework zur Verfügung stellt. Das JDK 1.2 enthält für viele Interfaces mehrere Implementierungen.Die Methoden, die ein Interface zum Manipulieren der Datenelemente zur Verfügung stellt, sind einfach verständlich und können der elektronischen Referenz entnommen werden.
- Collection
Eine beliebige Gruppe von Objekten. Die im folgenden aufgeführten Interfaces Set, SortedSet und List sind von Collection abgeleitet.- Set
Eine Gruppe von Objekten mit Mengencharacter. Duplikate sind nicht erlaubt.- SortedSet
Analog zu Set mit dem Unterschied, dass die Elemente sortiert werden.- List
Eine Gruppe von Objekten, die über Integer-Werte indiziert werden. Duplikate sind erlaubt. Ein neues Element kann an eine beliebige Stelle in einer List positioniert werden.- Map
Map definiert eine Zuordnung von Schlüsseln zu Werten. Jedem Schlüssel wird eindeutig ein Wert zugewiesen. Schlüssel können somit keine Duplikate enthalten, Werte schon.- SortedMap
Map, deren Schlüssel zusätzlich sortiert werden.
Klassen, die SortedSet und SortedMap implementieren, bieten eine Sortierung für ihre Elemente an. Da prinzipiell beliebige Objekte in einer Kollektion gespeichert werden können, muss ein Sortierungskriterium bereitgestellt werden. Zu diesem Zweck werden die Interfaces Comparable und Comparator benutzt. Objekte, die in einer sortierten Kollektion gespeichert werden, müssen entweder das Interface Comparable implementieren oder die Kollektion muss einmalig mit einer Implementierung von Comparator initialisiert werden.
Das Interface Comparable definiert eine Methode:public int compareTo(Object o)Diese Methode vergleicht das übergebene Exemplar mit dem Exemplar, in dem der Aufruf stattfindet. Der Rückgabewert der Methode sollte folgende Werte annehmen: Eine negative Zahl, falls das aufgerufene Objekte kleiner ist, 0, falls die Objekte gleich sind und eine positive Zahl, falls das aufgerufene Objekte größer ist.
Da die Implementierung eines Interface nur möglich ist, wenn man Zugriff auf den Quellcode hat, wird im JDK zusätzlich das Interface Comparator definiert. Comparator definiert die Methodepublic int compare(Object o1, Object o2)Diese Methode sollte prinzipiell dasselbe Verhalten wie compareTo() bei Comparable zeigen: Negativer Rückgabewert, wenn o1 im Sinne der Ordnung kleiner ist als o2, 0 bei Gleichheit und positiver Rückgabewert, wenn o1 > o2. Ein Comparator kann z. B. implementiert werden, wenn man keinen Zugriff auf den Quellcode von Klassen hat, sie aber dennoch in sortierten Kollektionen speichern möchte. Hierzu muss man eine Klasse definieren, die das Interface Comparator implementiert und in compareTo() die Vergleichsregeln implementieren. Die Initialisierung einer konkreten Kollektion mit einem Comparator erfolgt bei den vordefinierten Klassen mit dem Konstruktor:TreeMap tm = new TreeMap(new PersonComparator());Im obigen Codeausschnitt wird eine TreeMap (eine Implementierung von SortedMap) erzeugt und mit einem Comparator initialisiert.
Für Implementierungen des Interface Collection gibt es eine Möglichkeit, alle Elemente nacheinander zu durchlaufen. Diese Funktion wird vom Interface Iterator bereitgestellt. Iterator hat prinzipiell dieselbe Aufgabe wie die Klasse Enumeration, mit dem Unterschied, dass Elemente beim Durchlaufen auch gelöscht werden können. Hierfür stellt Iterator die Methode remove() zur Verfügung. Über die Methode iterator() kann ein Iterator für eine Kollektion ermittelt werden. iterator() ist im Interface Collection definiert. Bei Kollektionen, die nicht direkt das Interface Collection implementieren, wie z. B. die Klasse TreeMap, kann man über die Methode values() ein Collection-Exemplar ermitteln, das Zugriff auf die Original-Elemente bietet. Folgendes Beispiel zeigt, wie ein Iterator von der Klasse TreeMap ermittelt und bearbeitet wird:TreeMap tm = new TreeMap(); // Elemente der Kollektion hinzufügen // ... Collection col = tm.values(); Iterator iter = col.iterator(); // Elemente durchlaufen while(iter.hasNext()) { Object o = iter.next(); // hier Bearbeiten der Elemente // ... }Die Methode values() bietet die Möglichkeit, auf eine Map aus der Sicht einer Collection zuzugreifen. Analog zu values() sind in den Klassen des Java Collection-Frameworks weitere Methoden definiert, die unterschiedliche Sichten auf die vorhandenen Datenstrukuren ermöglichen. Diese Methoden können im Einzelnen in der elektronischen Referenz nachgeschlagen werden.