Java Standard: Collection Framework


Das Paket java.util bietet mit dem Collection Framework einige interessante Klassen, die von der Funktionalität ähnlich arbeiten wie die Standard Template Library (STL) von C++. Dazu gehören Vector, Array, Sets, Maps, abstrakte Datentypen und Iteratoren. Ab Java1.5 (Java5) sind die Collections auch generisch, d.h. die Collections arbeiten mit Generics.

In den folgenden Abschnitten werden Beispiele für die Anwendungen dieser Datenstrukturen und auch die Vorteile der Generizität aufgezeigt.

Unter einem Vector kann man sich eine Liste vorstellen, der beliebig viele Objekte hinzugefügt werden können. Dies ist der gravierende Vorteil gegenüber einem Array, bei dem man zur Laufzeit eine fixe Länge zuweisen muss. Ist aber die Anzahl der Elemente einer Liste von komplexen Bedingungen abhängig, so kann die Berechnung der Array-Länge schwierig werden. In solchen Fällen ist es ratsam, einen Vector zu verwenden.

Im folgenden Beispiel wird abhängig von einer zufälligen Ja-Nein-Entscheidung ein String-Wert dem Vector hinzugefügt.

//Initialisierung
Vector beliebigeListe = new Vector();
Random zufallsGenerator = new Random();

//Befuellen der Liste
for(int i = 0; i < 30; i++) {
  if (zufallsGenerator.nextBoolean()) {
    beliebigeListe.add(new Integer(i));
  }
}

//Ausgabe aller Listenelemente
int elemAnz = beliebigeListe.size();
for(int i = 0; i < elemAnz; i++) {
  System.out.println(beliebigeListe.get(i).toString());
}

Lässt man diesen Code mehrmals laufen, so stellt man fest, dass der Vector unterschiedlich viele Elemente enthalten kann. Bei der Ausgabe der Vector-Elemente wurde die toString()-Methode verwendet, die in der Klasse Object definiert ist, und somit für jeden Typ einen String-Wert zurück gibt. Was geschieht aber, wenn man aber andere Operationen mit den Elementen durchführen will?

Wird wie gesagt nur ein Vector ohne die Anwendung von Generizität erstellt, so muss man bei der Bearbeitung der Elemente Cast-Operationen durchführen, d.h. man muss überprüfen, ob es sich bei einem Element, um den richtigen Typ für eine bestimmte Operation handelt.

Hier wird in einem ersten Beispiel der Umgang mit der Collection Set (Menge) demonstriert. Ein Set ist eine Datenstruktur, in der jedes Element nur einmal vorkommen darf, d.h. der Test obj.equals( obj2 ) darf nicht positiv sein. Hier wird nun beispielhaft der Umgang mit einem TreeSet demonstriert. Der Set wird aufgebaut und mit einem Iterator ausgelesen:

  final int MAX = 10;
  Set ss = new TreeSet();
  for( int i = 0; i < MAX; i++ ) 
  {
     System.out.println( "  - Integer(" + i + ")  speichern" );
     ss.add( new Integer( i ));
  }
  System.out.println();
  Iterator i = ss.iterator();
  while( i.hasNext() ) 
  {
     System.out.println( i.next() );
  }