08.04 Die Set-Schnittstelle

Ein java.util.Set spezifiziert eine java.util.Collection. In diesem Kapitel werden Sie einiges über die Funktionsweise und Einsatzorte dieses Interfaces lernen.

Allgemeines zu Sets

Ein Set erlaubt keine doppelten Einträge. Sie werden in einem Set also keine zwei Objekte finden, bei denen die equals-Methode true zurückliefert. Es ist allerdings nicht definiert – und liegt somit an der jeweiligen Implementierung – was passiert, wenn ein Objekt in einem Set so verändert wird, dass es zu einem anderen, ebenfalls bereits hinzugefügten Element in diesem Set gleich ist. Ein Set darf sich jedoch nicht selbst als Element aufnehmen. Beachten Sie auch, dass ein Objekt enthalten sein kann, welches gleich null ist. Generell liegen Beschränkungen auf bestimmte Datentypen bei der jeweiligen Implementation des Sets und sind durchaus legitim. Wird versucht, ein Objekt in ein solches Set hinzuzufügen, welches das Set nicht aufnehmen kann/darf, wird typischerweise eine NullPointerException oder eine ClassCastException geworfen. Es kann aber auch eine beliebige andere Exception geworfen werden – oder einfach false zurückgegeben werden.

Die Reihenfolge, in der sich die Objekte in einem Set befinden, ist nicht konstant. Im Gegensatz zur java.util.List muss ein Element in einem Set nicht zwingend mit einem Index assoziiert werden. Das bedeutet jedoch nicht zwingend, dass es keine solche Implementierung geben darf. Deshalb wird typischerweise auf die enthaltenen Objekte über den Iterator zugegriffen. Ebenso wie die java.util.List erwartet ein Set einen generischen Typen, der die Objekte, die das Set aufnehmen kann, spezifiziert. Wird kein generischer Typ gesetzt, können alle Objekt aufgenommen werden, die das Set zulässt (siehe vorhergehender Absatz). Dieser Zustand sollte aber auch hier vermieden werden. Ansonsten sind natürlich noch die Anforderungen einer Collection gegeben. Somit stellt ein Set eine mathematische Menge dar.

Methoden eines Sets (zusätzlich zu den Methoden von java.util.Collection)

  • containsAll(Collection<?> c) – gibt true zurück, falls alle Elemente in der übergebenen Collection in diesem Set enthalten sind.

Verwendung

Das Interface java.util.Set wird bereits in vielen Standardklassen implementiert. Die wichtigsten werden im Kapitel 08.07 Implementierungen von Set vorgestellt. Anbei finden Sie aber noch ein Beispiel mit einem recht häufig verwendetem Set – dem HashSet.

Set<String> set = new HashSet<String>();
System.out.println(set.add("One"));
System.out.println(set.add("Two"));
System.out.println(set.add("One"));
System.out.println(set.add(null));
System.out.println(set.add(null));
for (String str : set) {
  System.out.println(str);
}

Die Ausgabe lautet wie folgt:

true
true
false
true
false
null
Two
One

Sie sehen, dass kein Objekt doppelt hinzugefügt werden kann. Auch einen null-Wert nimmt das Set auf. Allerdings wurde – wie bereits erwähnt – die Reihenfolge, in welcher die Elemente hinzugefügt wurden, nicht eingehalten.

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.