Java Collections Framework
Das Java Collections Framework stellt Schnittstellen und Klassen für
Datensammlungen bereit. Alle Collections-Typen befinden sich im Paket
java.util. Die drei Grundformen sind List<E>, Set<E> und Queue<E>, zu
denen jeweils konkrete Implementierungen existieren.
- Listen (Lists)
- Mengen (Sets)
- Warteschlangen (Queues)
Eine Liste ist eine geordnete Folge von Objekten, die doppelte Elemente enthalten darf. Der Zugriff auf die Elemente erfolgt über den Index oder sequentiell.
Konkrete Implementierungen der Schnittstelle List<E> stellen die Klassen
ArrayList<E> und LinkedList<E> (siehe auch
Feldbasierte Listen und Listen) dar.
Eine Menge ist eine Ansammlung von Objekten, die keine doppelten Elemente enthalten darf. Der Zugriff erfolgt über typische Mengenoperationen wie Vereinigung, Schnittmenge und Differenz.
Konkrete Implementierungen der Schnittstelle Set<E> stellen die Klassen
HashSet<E> und TreeSet<E> dar. Die Klasse HashSet<E> implementiert die
Menge dabei in Form einer Hashtabelle, die Klasse TreeSet<E> in Form eines
Binärbaumes.
Eine Warteschlange ist eine Folge von Objekten, bei der Elemente nach dem FIFO-Prinzip (First In, First Out) verwaltet werden: Neue Elemente werden am Ende eingefügt, entnommen wird immer das vorderste Element. Doppelte Elemente sind erlaubt.
Konkrete Implementierungen der Schnittstelle Queue<E> sind PriorityQueue<E>
und LinkedList<E>. Die Klasse PriorityQueue<E> implementiert eine
Vorrang-Warteschlange, bei der die Elemente nicht nach dem FIFO-Prinzip, sondern
nach ihrer Wichtigkeit sortiert entnommen werden.
Iteratoren
Ein Iterator ermöglicht den sequentiellen Zugriff auf die Elemente einer
Datensammlung, ohne die interne Struktur kennen zu müssen. Die Schnittstelle
Iterator<E> bietet die Methoden boolean hasNext(), E next() und
void remove().
public class MainClass {
public static void main(String[] args) {
List<String> names = List.of("Hans", "Peter", "Lisa");
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
}
}
Auch die bereits bekannte for-each-Schleife basiert intern auf Iteratoren. Beim Kompilieren wird sie automatisch in eine Iterator-Schleife umgewandelt. Die ausführliche Schreibweise ist daher gleichwertig zur Kurzschreibweise.
public class MainClass {
public static void main(String[] args) {
List<String> names = List.of("Hans", "Peter", "Lisa");
// Ausführliche Schreibweise mit Iterator
for (Iterator<String> iterator = names.iterator(); iterator.hasNext();) {
String name = iterator.next();
System.out.println(name);
}
// Kurzschreibweise mit for-each
for (String name : names) {
System.out.println(name);
}
}
}