Arrays und Listen

Wie speichern Arrays Daten und wann sind sie nützlich?

Arrays: Feste Behälter für gleichartige Daten

Stell dir einen Eierkarton oder eine Reihe von fest installierten, nummerierten Postfächern vor. Jedes Fach hat eine eindeutige Nummer (den Index), und in jedem Fach kannst du genau einen Gegenstand desselben Typs aufbewahren. Ein Array in der Programmierung ist ganz ähnlich:

  • Es speichert eine Sammlung von Elementen, die alle vom gleichen Datentyp sind (z.B. nur ganze Zahlen oder nur Textzeichenketten).
  • Es hat eine feste Größe, die bei seiner Erstellung festgelegt wird – die Anzahl der "Fächer" ist von Anfang an bekannt und unveränderlich.
  • Du kannst direkt und sehr schnell auf jedes Element zugreifen, indem du seinen Index (die Fachnummer) angibst. Wichtig: Der erste Index in vielen modernen Programmiersprachen wie C#, Java, Python oder JavaScript ist die 0.

Arrays sind besonders dann eine gute Wahl, wenn du eine im Voraus bekannte Anzahl von Elementen speichern möchtest und häufigen, schnellen Zugriff auf einzelne Elemente benötigst. Das Konzept ist in vielen Programmiersprachen sehr ähnlich. Beispiel: Du möchtest die täglichen Höchsttemperaturen einer Woche speichern. Da eine Woche immer 7 Tage hat, ist ein Array der Größe 7 ideal.

// Ein Array für 7 ganze Zahlen (Temperaturen) wird deklariert und initialisiert.
int[] temperaturenProWoche = new int[7];

// Werte zuweisen
temperaturenProWoche[0] = 23; // Montag (Index 0)
temperaturenProWoche[1] = 25; // Dienstag (Index 1)
temperaturenProWoche[2] = 22; // Mittwoch (Index 2)
// ... und so weiter für die restlichen Tage

// Direkter Zugriff auf die Temperatur am Mittwoch
int temperaturAmMittwoch = temperaturenProWoche[2];
Console.WriteLine($"Die Temperatur am Mittwoch war: {temperaturAmMittwoch}°C");
// Ausgabe: Die Temperatur am Mittwoch war: 22°C

Speicherorganisation und schneller Zugriff

Die Elemente eines Arrays werden im Arbeitsspeicher des Computers typischerweise in einem zusammenhängenden Speicherbereich abgelegt. Das bedeutet, sie liegen direkt hintereinander, wie die Fächer in unserem Eierkarton. Diese kontinuierliche Speicherung ist der Grund, warum der Zugriff auf ein beliebiges Element über seinen Index so extrem schnell ist. Der Computer kann die genaue Speicheradresse eines Elements direkt berechnen (vereinfacht: Startadresse des Arrays + (Index * Größe eines Elements)). Dieser direkte Zugriff hat eine sogenannte konstante Zeitkomplexität (O(1)), was bedeutet, die Zugriffszeit ist blitzschnell und unabhängig davon, wie groß das Array ist oder an welcher Position sich das Element befindet.

Wie bieten Listen Flexibilität und was unterscheidet sie von Arrays?

Listen: Dynamische Sammlungen für variable Datenmengen

Stell dir nun eine Einkaufsliste auf einem Zettel vor. Du beginnst vielleicht mit ein paar Dingen, aber während du durch den Laden gehst, kannst du jederzeit neue Artikel hinzufügen oder bereits notierte streichen. Die Liste kann also wachsen oder schrumpfen. Eine Liste (in vielen modernen Sprachen wie Python als list, oder List<T> in C# und ArrayList in Java) ist genau das:

  • Sie speichert eine geordnete Sammlung von Elementen.
  • Ihre Größe ist dynamisch und kann sich während der Laufzeit des Programms ändern. Du kannst Elemente hinzufügen oder entfernen.
  • Der Zugriff auf Elemente erfolgt häufig ebenfalls über einen Index (beginnend bei 0), ähnlich wie bei Arrays.

Listen sind ideal, wenn du nicht von vornherein weißt, wie viele Elemente du speichern musst, oder wenn sich die Anzahl häufig ändert. Beispiel: Du möchtest die Namen aller Teilnehmenden eines Workshops erfassen. Zu Beginn ist die Liste leer, und jedes Mal, wenn sich jemand anmeldet, fügst du einen Namen hinzu.

# Eine leere Liste für Workshop-Personen wird erstellt
workshop_personen = []

# Personen melden sich an
workshop_personen.append("Anna Schmidt")
workshop_personen.append("Max Mustermann")
workshop_personen.append("Julia Klein")

print(f"Aktuelle Anzahl: {len(workshop_personen)}")
# Ausgabe: Aktuelle Anzahl: 3

# Eine weitere Person meldet sich an
workshop_personen.append("Tom Weber")
print(f"Nach weiterer Anmeldung: {len(workshop_personen)}")
# Ausgabe: Nach weiterer Anmeldung: 4

# Zugriff auf die erste Person (Index 0)
erste_person = workshop_personen[0]
print(f"Die erste Person ist: {erste_person}")
# Ausgabe: Die erste Person ist: Anna Schmidt

Interne Funktionsweise und Performance-Aspekte

Obwohl Listen in vielen modernen Sprachen einen bequemen, indexbasierten Zugriff wie Arrays bieten, ist ihre interne Funktionsweise oft komplexer, um die dynamische Größe zu ermöglichen. Häufig verwenden solche Listen intern ein Array, um die Elemente zu speichern. Wenn dieses interne Array voll ist und du ein weiteres Element hinzufügst, passiert im Hintergrund meist Folgendes:

  1. Ein neues, größeres Array wird im Speicher angelegt.
  2. Alle Elemente aus dem alten, kleineren Array werden in das neue, größere Array kopiert.
  3. Das alte Array wird freigegeben, und die Liste verwendet fortan das neue, größere Array.

Dieser Vorgang des Neuzuweisens und Kopierens (Resizing) kann, wenn er häufig auftritt (z.B. beim Hinzufügen vieler einzelner Elemente zu einer bereits großen Liste), zu einem kurzzeitigen Performance-Einbruch führen. Arrays haben diesen "Resizing"-Overhead nicht, da ihre Größe fix ist. Dafür bieten Listen die Flexibilität, ihre Größe dynamisch an den Bedarf anzupassen.

Lernziele

  • die Speicherrepräsentation von Arrays und deren Auswirkungen auf die Zugriffszeiten erklären, indem erläutert wird, wie Elemente eines Arrays typischerweise in zusammenhängenden Speicherbereichen abgelegt werden und wie dies den direkten Zugriff per Index (O(1)) ermöglicht.
  • das Konzept von Arrays erklären, indem die Eigenschaften von Arrays (feste Größe, direkter Zugriff auf Elemente über Indizes) und ihre grundlegende Verwendung zur Speicherung von Datenmengen anhand von Codebeispielen in einer modernen Programmiersprache erläutert werden.
  • das Konzept von Listen erklären, indem die Eigenschaften von Listen (dynamische Größe, sequentieller Zugriff auf Elemente) und ihre grundlegende Verwendung zur Speicherung von Datenmengen anhand von Codebeispielen in einer modernen Programmiersprache erläutert werden.

Genug gelesen? Zeit, es wirklich zu können!

Die Theorie aus diesem Artikel ist die perfekte Basis. In der asyoube Lernplattform wendest du dieses Wissen an, bekommst persönliches Feedback und bereitest dich interaktiv auf deine Ausbildung oder deine Prüfungen vor.

Für Ausbilder & Unternehmen

Möchten Sie Ihr gesamtes Team mit asyoube ausbilden? Entdecken Sie unsere B2B-Lösung mit einfacher Verwaltung, Fortschritts-Tracking für Ihre Azubis und attraktiven Team-Preisen.