Statisches Array vs Dynamische Liste
Beide Datenstrukturen speichern Werte mit Index-Zugriff. Der Unterschied liegt in der Größe: fest oder veränderbar.
Übersicht
| Statisches Array | Dynamische Liste |
|---|
| Größe | fest (beim Anlegen) | wächst und schrumpft |
| Java | int[] | ArrayList<Integer> |
| Python | array.array (selten) | list |
| Index-Zugriff | O(1) | O(1) |
| Set an Position | O(1) | O(1) |
| Am Ende anfügen | nicht möglich | O(1) amortisiert |
| Am Anfang einfügen | nicht möglich | O(n) |
| Speicher | minimal, fest reserviert | etwas Overhead, dynamisch |
| Länge abfragen | arr.length (Property) | list.size() / len(list) |
Wann welche?
| Anwendungsfall | Wähle |
|---|
| Größe ist vorher bekannt und fest (12 Monate, 7 Wochentage) | Statisches Array |
| Maximale Performance, minimaler Speicher | Statisches Array |
| 2D-Matrizen mit fixer Größe | Statisches 2D-Array |
| Du weißt vorher nicht wie viele Elemente | Dynamische Liste |
| Du musst oft anhängen/entfernen | Dynamische Liste |
| Standardfall in der Praxis | Dynamische Liste |
In 90% der praktischen Fälle nimmst du eine dynamische Liste. Statische Arrays nur wenn du explizit Performance/Speicher optimieren musst, oder wenn die Größe wirklich fest ist.
Wie funktioniert ArrayList intern?
ArrayList ist intern selbst ein statisches Array — nur dass es bei Bedarf neu angelegt und kopiert wird:
ArrayList wird angelegt mit Capacity 10: [_,_,_,_,_,_,_,_,_,_] size=0
add(5): [5,_,_,_,_,_,_,_,_,_] size=1
add(8): [5,8,_,_,_,_,_,_,_,_] size=2
... (bis Capacity voll)
add(99) bei voller Capacity:
→ neues Array mit doppelter Capacity (20) anlegen
→ alle Werte kopieren (O(n))
→ 99 hinzufügen
Daher ist add() amortisiert O(1): die teure Kopier-Operation passiert nur alle log₂(n) Mal, gemittelt bleibt O(1) übrig.
Klausur-Klassiker
Frage: Du musst eine Liste von 1000 Elementen 500-mal am Anfang ergänzen. Was ist der Gesamt-Aufwand?
Antwort: 500 × O(n) = 500 × 1000 = 500.000 Operationen. ArrayList ist dafür ungeeignet — eine LinkedList oder Deque wäre besser.