Thema in Kurzform:
Arrays in Java sind Objekte und können mit dem new-Operator oder alternativ mit einer Initialisierungsliste erstellt werden. Sie haben eine feste Größe, die nach der Erstellung nicht mehr geändert werden kann.
Die Elemente eines Arrays sollten logisch zusammenpassen. So können wir die Lottozahlen oder Ihre Lieblingsfilme in entsprechenden Arrays sammeln. Damit das aber auch funktioniert, gibt es noch eine technische Bedingung:
Um ein Array zu erstellen, benutzen wir folgende allgemeine Syntax:
typ[] arrayName = new typ[Gesamtgroesse];
Wir müssen also bei der Deklaration des Arrays den Datentyp angeben (int, String etc.), gefolgt von eckigen Klammern und dem gewünschten Namen des Arrays. Die Initialisierung (also alles nach dem = Zeichen) beginnt mit dem Schlüsselwort new, gefolgt (nochmal) vom Datentyp.
In den eckigen Klammern auf der rechten Seite schreiben wir die Gesamtgrößedes Arrays. Das führt uns zu einer weiteren wichtigen Regel im Umgang mit Arrays:
Wollen wir nun beispielsweise ein Array mit Lottozahlen erzeugen, sieht der konkrete Java-Code so aus:
int[] lottozahlen = new int[6];
Nice. Fehlen nur noch die einzelnen Array-Elemente.
Die Elemente eines Arrays sind numerisch sortiert. Diese Nummern nennen wir Index-Nummern. Die Index-Nummerierung erfolgt dabei immer aufsteigend und zwar beginnend bei dem Index 0. Somit hat das erste Element eines Arrays immer den Index 0 und das letzte den Index [Array-Größe n] MINUS 1. Der Index ist so etwas wie die eindeutige „Adresse“ eines Elements in seinem Array. Ein kleines Schaubild macht die Sache klar:
Wir können die einzelnen Index-Nummern in eckigen Klammern auswählen, um an die jeweilige Position im Array ein neues Element zu platzieren:
int[] lottozahlen = new int[6];
lottozahlen[0] = 2;
lottozahlen[1] = 7;
lottozahlen[2] = 11;
lottozahlen[3] = 30;
lottozahlen[4] = 41;
lottozahlen[5] = 42;
Wir können das Erstellen und "Befüllen" eines Arrays auch in einem Schritt erledigen.
Wir setzen hierfür eine Initialisierungsliste ein:
int[] lottozahlen = {2, 7, 11, 30, 41, 42};
In einem Schritt das Array zu erstellen und Elemente hinzufügen, ist praktisch und übersichtlich. Dieser Weg wird häufig angewandt, wenn die Elemente beim Erstellen bereits bekannt sind.
Um einzelne Elemente eines Arrays auszulesen, schreiben wir den entsprechenden Index in eckigen Klammern hinter den Arraynamen. Die folgende Tabelle gibt uns eine Übersicht über die Index-Positionen und Elemente für das Array lottozahlen:
Index | Zugriff | Element |
---|---|---|
0 | lottozahlen[0] | 2 |
1 | lottozahlen[1] | 7 |
2 | lottozahlen[2] | 11 |
3 | lottozahlen[3] | 30 |
4 | lottozahlen[4] | 41 |
5 | lottozahlen[5] | 42 |
Im praktischen Code-Einsatz sieht das dann so aus:
System.out.println(lottozahlen[3]); // 30
System.out.println(lottozahlen[5]); // 42
System.out.println(lottozahlen[2-1]); // 7
int addition = lottozahlen[0] + lottozahlen[1]; // 9
Ein Fehler, der sehr häufig gemacht wird, ist der Versuch, auf ein Array-Element außerhalb der gültigen Index-Grenzen zuzugreifen. Für unser Lottozahlen-Beispiel mit der Länge 6 liegen die gültigen Index-Werte zwischen 0 und 5.
Die Benutzung von Indizes außerhalb dieses Bereichs führt zu einem Laufzeitfehler, der dem Java-Programmierer als ArrayIndexOutOfBoundsException bekannt ist. Zum Beispiel:
lottozahlen[6] = 8; // ArrayIndexOutOfBoundsException
Wo Arrays sind, sind Schleifen nicht weit. Hier der Grund, warum:
// String-Array erzeugen:
String[] filmklassiker = {"Terminator",
"Casablanca",
"2001: Odyssee im Weltraum",
"Der Pate",
"Inception",
"Pulp Fiction",
"Fight Club",
"Schindlers Liste"
};
Wenn wir nun jedes Element auf der Konsole printen wollen, könnten wir das ganz naiv wie folgt tun:
System.out.println(filmklassiker[0]);
System.out.println(filmklassiker[1]);
System.out.println(filmklassiker[2]);
System.out.println(filmklassiker[3]);
System.out.println(filmklassiker[4]);
System.out.println(filmklassiker[5]);
System.out.println(filmklassiker[6]);
System.out.println(filmklassiker[7]);
Hüten Sie sich aber davor, jemals solch einen Code abzugeben. Um einen guten Programmierstil einzuhalten, sollten wir stets auf doppelten Code verzichten (Don't repeat yourself!). Nicht nur, dass es unelegant ist. Solch ein Code ist außerdem unpraktisch, lästig zu pflegen und häufige Fehlerquelle. Das gilt bereits für ein Array mit einer handvoll Elementen. Stellen Sie sich einmal ein Array mit 100 Elementen vor. Man würde sich lächerlich machen.
Die Lösung lautet: Einsatz einer Schleife:
for(int i = 0; i < filmklassiker.length; i++){
System.out.println(filmklassiker[i]);
}
Kurz und knackig!
Den Schleifentyp, den wir hier einsetzen, nennt man for-Schleife. Eine for-Schleife wird mit einer Schleifenvariablen i gesteuert, Der Startwert der Schleifenvariablen iist 0 und er wird nach jedem Schleifendurchlauf um +1 erhöht. Die Schleifenbedingung lautet i < filmklassiker.length, das heißt: Die Schleife wird solange wiederholt, wie i kleiner als die Größe des Arrays ist.
Auf diese Art nimmt bei jedem Schleifendurchlauf die Schleifenvariablen nacheinander einen der gültigen Index-Werte an. Somit können wir alle Elemente eines Arrays auswählen.
Bisher haben wir nur mit eindimensionalen Arrays gearbeitet. Für komplexere Datenstrukturen genügt das aber oftmals nicht. Wir werden es dann mit multidimensionalen Arrays zu tun bekommen.
Da vor allem zweidimensionale Arrays recht häufig vorkommen, schauen wir uns diese jetzt mal genauer an.
Stellen Sie sich ein zweidimensionales Array als eine Art Gitter mit Koordinaten vor.
Wie man sieht, besteht ein zweidimensionales Array aus einer Reihe von untergeordneten Einzelarrays ("Subarrays"). Diese wiederum halten jeweils einzelne Elemente.
Erstellen wir nun mit Java ein zweidimensionales Array für int-Werte:
int[][] array = new int[4][5];
Man benötigt nun zwei eckige Klammern. Beim Erstellen des Array-Objekts schreiben wir in die erste eckige Klammer die Länge des übergeordneten "Hauptarrays", d.h. wieviele Subarrays es im Array gibt (hier: 4).
In die zweite eckige Klammer wird die Länge der einzelnen "Subarrays" eingetragen, also wieviele Einzelelemente jedes dieser "Subarrays" enthalten soll (hier: 5).
Jetzt können wir den einzelnen Array-Positionen konkrete Elemente zuweisen:
array[0][1] = 100;
array[1][4] = 150;
Nicht vergessen: Die Zählung der Elemente in einem Array beginnt mit der Indexnummer 0. So hat das zweite Element des ersten Subarrays den Wert 100 (array[0][1]=100;) und das fünfte Element des zweiten Subarrays den Wert 150 zugewiesen bekommen (array[1][4]=150;).
Die restlichen Array-Positionen wurden von uns nicht explizit hinzugefügt und haben somit allesamt den Standardwert 0.
Mit der oben beschriebenen Variante zweidimensionale Arrays zu erstellen, sind alle untergeordneten Arrays gleich lang. In unserem Beispiel oben haben alle die Länge 5).
Wenn wir für die einzelnen Subarrays aber jeweils unterschiedliche Längenbenötigen, können wir mehrdimensionaler Arrays mittels Initialisierungslisteerstellen:
int[][] array2D = {{2,4,1,34}, {1}, {9,10,14}};
System.out.println(array2D[0].length); // 4
System.out.println(array2D[1].length); // 1
System.out.println(array2D[2].length); // 3
Innerhalb der äußeren geschweiften Klammern befinden sich wiederum drei innere Paare geschweifter Klammern, in die wir die einzelnen Elemente der (hier: 3) Subarrays schreiben. Mithilfe der Array-Eigenschaft length fragen wir anschließend testweise die Länge der drei unterschiedlich großen Subarrays ab und erhalten erwartungsgemäß unterschiedliche Werte.
Java Basics
[Java einrichten] [Variablen] [Primitive Datentypen] [Operatoren] [if else] [switch-case] [Arrays] [Schleifen]
Objektorientierung
[Einstieg] [Variablen ] [Konstruktor] [Methoden] [Rekursion] [Statische Member] [Initializer] [Pass-by-value] [Objektsammlungen] [Objektinteraktion] [Objekte löschen]
Klassenbibliothek
[Allgemeines] [String ] [Math] [Wrapper] [Scanner] [java.util.Arrays] [Date-Time-API]
Vererbung
[Einstieg Vererbung] [Konstruktoren bei Vererbung ] [Der protected Zugriffsmodifikator] [Abstrakte Klassen und Methoden] [Polymorphie in Java] [Typumwandlung] [Die Klasse Object] [Die toString()-Methode] [Objekte vergleichen] [Was ist ein Interface?]