Listen
Eine Liste ist eine geordnete Folge von Elementen, die auch doppelte Einträge
enthalten kann. Der Zugriff erfolgt über den Index oder sequentiell. Die Java
API stellt dafür die Schnittstelle List<E> sowie die Klassen ArrayList<E>,
LinkedList<E> und Arrays bereit.
- Unveränderbare Listen
- Veränderbare Listen fixer Größe
- Veränderbare Listen dynamischer Größe
Die Schnittstelle List<E> bietet Fabrikmethoden zum Erzeugen unveränderlicher
Listen. Unveränderbar bedeutet, dass weder Elemente hinzugefügt, entfernt noch
ersetzt werden können.
public class MainClass {
public static void main(String[] args) {
List<String> names = List.of("Hans", "Peter", "Lisa");
System.out.println(names.size());
System.out.println(names.get(0));
names.set(0, "Max"); // Laufzeitfehler: Liste ist unveränderbar
names.add("Heidi"); // Laufzeitfehler: Liste ist unveränderbar
names.remove(0); // Laufzeitfehler: Liste ist unveränderbar
}
}
Fabrikmethoden sind Methoden, die Objekte erzeugen.
Die Klasse Arrays bietet neben Methoden zum Sortieren und Durchsuchen von
Feldern auch eine Methode zum Erzeugen veränderbarer Listen fixer Größe. Die
Anzahl der Elemente ist dabei festgelegt; einzelne Elemente lassen sich jedoch
ersetzen.
public class MainClass {
public static void main(String[] args) {
List<String> names = Arrays.asList("Hans", "Peter", "Lisa");
System.out.println(names.size());
System.out.println(names.get(0));
names.set(0, "Max"); // Element ersetzen ist erlaubt
names.add("Heidi"); // Laufzeitfehler: Größe ist fest
names.remove(0); // Laufzeitfehler: Größe ist fest
}
}
Die Klasse ArrayList<E> implementiert eine veränderbare Liste auf Basis eines
Feldes, die Klasse LinkedList<E> auf Basis doppelt verketteter Knoten. Beide
unterstützen das Hinzufügen, Ersetzen und Entfernen von Elementen sowie eine
dynamische Größe.
public class MainClass {
public static void main(String[] args) {
List<String> names = new ArrayList<>(); // alternativ: new LinkedList<>()
names.add("Hans");
names.add("Peter");
names.add("Lisa");
System.out.println(names.size());
System.out.println(names.get(0));
names.set(0, "Max");
names.add("Heidi");
names.remove(0);
}
}
Eine feldbasierte Liste (ArrayList) ist bei wahlfreiem Zugriff über den Index
schneller. Eine verkettete Liste (LinkedList) ist bei Einfüge- und
Löschoperationen in der Mitte der Liste schneller, da keine Elemente verschoben
werden müssen.