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 übergebenenCollection
in diesemSet
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.