Collection Klassen
Klassen
Klassen und Implementierung
Interface | Hash-Tabelle | Array | B-Baum | Verkettete Listen |
---|---|---|---|---|
Set | HashSet | – | TreeSet | – |
List | – | ArrayList | – | LinkedList |
Deque | – | ArrayDeque | – | LinkedList |
Map | HashMap | – | TreeMap | – |
ArrayList
implementiert dasList
-Interface basierend auf Arrays- Wahlfreier Zugriff über
get(int index)
ist billig - Anfügen neuer Elemente ist bedingt performant
- Einfügen von Elementen ist teuer
LinkedList
verwendet verkettete Listen- Wahlfreier Zugriff über
get(int index)
ist teuer - Anfügen neuer Elemente ist billig
- Einfügen von Elementen ist billig
HashSet
implementiert dasSet
-Interface basierend auf den Hash-Werten- Grundlegende Operationen (
add
,remove
,contains
) sind O(1) - Daten sind nicht geordnet
- Verwendet
equals()
TreeSet
implementiert dasSet
-Interface basierend auf B-Trees (red-black, selbst-balancierender Binärbaum)- Grundlegende Operationen (
add
,remove
,contains
) sind O(log(n)) - Daten sind geordnet und sortiert
- Verwendet
compareTo()
stattequals()
Es gibt eine ganze Reihe unterschiedlicher Implementierungen für die Interfaces des Collection-APIs. Bezüglich der Schnittstelle sind diese Klassen gleich; welche man verwendet hängt vom Anwendungszweck ab und welche Operationen am häufigsten vorkommen. Die folgende Tabelle fasst die Eigenschaften kurz für die Implementierungen von List
zusammen:
Operation | ArrayList | LinkedList |
---|---|---|
anfügen | bedingt schnell | schnell |
einfügen | langsam | schnell |
Zugriff per Index | schnell | langsam |
iterieren | schnell | schnell |
Bei den Implementierungen von Set
ist das HashSet
beim Lesen und Schreiben schneller als das TreeSet
, muss dafür aber über den Umweg einer Liste sortiert werden. Beim TreeSet
ergibt sich die Sortierung von alleine.
Die Sache mit null
Ob man einer Collection null
hinzufügen darf ist implementierungsabhängig
ArrayList
undLinkedList
erlaubennull
als Wert für beliebig viele EinträgeTreeSet
erlaubt nur dannnull
als Wert, wenn ein expliziter Comparator angegeben wird, bei natural ordering istnull
verbotenHashSet
erlaubtnull
grundsätzlichHashMap
erlaubtnull
als Schlüssel und als WertHashtable
verbietetnull
als Schlüssel und WertTreeMap
erlaubt nur dannnull
als Schlüssel, wenn ein expliziter Comparator angegeben wird, bei natural ordering istnull
verboten
Da die Regeln nur schwer zu merken sind und eigentlich nur das Interface als Maßstab benutzt werden sollte, nicht aber die Implementierung, ist generell davon abzuraten, null
in einer Collection zu speichern. Braucht man ein Element, das das „Nichts“ repräsentiert, erstellt man einfach ein spezielles Objekt, das für den fehlenden Wert steht und prüft dann mit ==
ob dieses oder ein normales Objekt vorliegt.
Die Klasse Collections
Enthält Hilfsmethoden für den Umgang mit Collections
Auswahl von Methoden
emptyList()
,emptyMap()
,emptySet()
fill(List<? superT>, T)
max(Collection<? extends T)
,min(...)
List<T> nCopies(int, T)
reverse(List<T>)
shuffle(List<?>)
synchronizedCollection(Collection<T>)
,synchronizedList(List<T>)
, …unmodifiableCollection(Collection<T>)
,unmodifiableList(List<T>)
, …
Die Klasse Collections
enthält eine ganze Reihe von Hilfsmethoden, die man aus Gründen der Übersichtlichkeit und Allgemeingültigkeit nicht in den Interfaces untergebracht hat. Hierzu gehören Methoden, um die Elemente von Liste zu mischen, zu sortieren, umzukehren etc.
Das alte Collections-API
- Es gibt ein altes und ein neues Collections-API
- Aus Gründen der Kompatibilität sind noch die alten Klassen noch vorhanden
Hashtable
Vector
Enumeration
- Das alte API sollte nicht mehr verwendet werden!
Das neue Collections-API ist die Obermenge des alten und bietet alle Funktionen, die das alte API anbot. Es hat darüber hinaus aber noch mehr Fähigkeiten und ist sauberer entworfen. Daher sollte man das alte Collection-API nicht mehr verwenden.