List
Kurz: Ein Collections-Interface für geordnete, indexierte Sammlungen, die Duplikate erlauben — die zwei wichtigsten Implementierungen sind ArrayList und LinkedList.
Genauer: Im Gegensatz zu Set behält eine List die Einfügereihenfolge bei und lässt gezielten Zugriff über einen Index zu (list.get(0)). Welche konkrete Implementierung sich lohnt, hängt vom Zugriffsmuster ab: viel Lesen per Index → ArrayList, viel Einfügen/Entfernen mitten in der Liste → LinkedList.
Im Detail
List<String> namen = new ArrayList<>(); // Interface-Typ links, konkrete Implementierung rechts
namen.add("Anna");
namen.add("Ben");
namen.add(0, "Erster");
List<String> unveraenderlich = List.of("Fix", "Eins", "Zwei"); // read-only, wirft bei add()
// Interface-basierte Deklaration erlaubt Austausch der Implementierung
List<String> switchTest = new LinkedList<>(); // identischer Code funktioniert genausoDie Konvention, immer gegen das INTERFACE (List) statt gegen die konkrete Klasse (ArrayList) zu programmieren, ist einer der wichtigsten Java-Style-Grundsätze: der aufrufende Code kümmert sich nur um das, was List verspricht (add, get, remove, …), und ist damit unabhängig davon, welche konkrete Implementierung tatsächlich dahintersteckt. Ändert sich später das Zugriffsmuster (z. B. von vielem Lesen zu vielem Einfügen in der Mitte), lässt sich new ArrayList<>() einfach durch new LinkedList<>() ersetzen, ohne den restlichen Code anfassen zu müssen — genau das Prinzip der Abstraktion in der Praxis. List.of(...) (seit Java 9) erzeugt eine unveränderliche Liste, nützlich für feste, nie zu ändernde Wertesammlungen.
Häufige Operationen im Überblick
List<Integer> zahlen = new ArrayList<>(List.of(3, 1, 4, 1, 5));
zahlen.sort(null); // aufsteigend sortieren (natürliche Ordnung)
Collections.reverse(zahlen); // in umgekehrte Reihenfolge bringen
int index = zahlen.indexOf(4); // Position des ersten Vorkommens, -1 falls nicht gefunden
List<Integer> teilliste = zahlen.subList(1, 3); // Ausschnitt, ist eine LEBENDE Sicht auf das Original!
zahlen.removeIf(n -> n > 3); // funktional filtern statt manuell iterierenEine wichtige Falle bei subList(): das Ergebnis ist keine Kopie, sondern eine VIEW auf denselben zugrundeliegenden Speicher — Änderungen an der Teilliste wirken sich direkt auf die Originalliste aus, und umgekehrt können strukturelle Änderungen an der Originalliste die Teilliste ungültig machen (ConcurrentModificationException beim nächsten Zugriff).
List vs. Array
Ein klassisches Java-Array (int[]) hat eine FESTE Größe und ist bei primitiven Typen speichereffizienter, kann aber nicht wachsen. Eine List wächst dynamisch mit add(), kostet dafür etwas Overhead (bei ArrayList intern selbst wieder ein Array, das bei Bedarf automatisch neu allokiert und kopiert wird, sobald die Kapazität überschritten wird). Für generische Typen (List<String>) gibt es ohnehin keine direkte Array-Alternative, da Java generische Array-Erzeugung (new String[]<T>) technisch nicht zulässt.
Siehe auch: ArrayList, LinkedList, Collections, Arrays