7.1 Eindimensionale Felder
7.1 Eindimensionale FelderDas Definieren und Erzeugen von eindimensionalen Feldern erfolgt nach ähnlichen Prinzipien wie die Verwaltung von Strings.
Es gibt hier zwei Varianten.
Anlegen und befüllen mit new() Operator
Die Deklaration anhand eines Feldes von Ganzzahlen mit Hilfe des new() Operators in 3 Schritten:
int[] array1; |
Hiermit wurde nur die Referenz auf ein (zukünftiges) Feld von Ganzzahlen angelegt. Siehe unten: Mit Hilfe des new() Operators wird ein leeres Feld angelegt. Nach dem Anlegen des Feldes kann man die Größe des Feldes mit dem Attribut length abfragen.:
array1 = new int[6]; int s = array1.length; |
Das Definieren der Variablen array1 und das Aufrufen des new() Operators hätte auch in einem Schritt erfolgen können
int[] array1 = new int[6];
Jetzt kann das Feld mit Werten belegt werden. Zum Beispiel mit Vielfachen der Zahl 17:
for ( int i=0; i<s; i++) {array1[i] = i*17;} |
Aufzählende Wertzuweisung
Java erlaubt auch die 3 Schritte von oben in einer einzigen Operation auszuführen. Hier können alle Werte als Aufzählung innerhalb von geschweiften Klammern direkt zugewiesen werden:
int[] array1 = {0,17,34,51,68,85};
Belegen mit einem festen Wert
Die Methode fill() erlaubt das belegen eines Feldes mit einem festen Wert
array.fill(-1);
Hier werden alle Elemente eines Feldes mit dem Wert -1 belegt.
Zuweisungen zwischen Arrayvariablen
Arrayvariablen verhalten sich wie Referenzen bezüglich Zuweisungen. Das Zuweisen des Nullwerts löscht die Referenz auf ein Feld(Array). Es ist dann ein Kandidat zum Löschen falls keine andere Referenz auf das Feld vorhanden ist. Das folgende Beispiel zeigt eine Zuweisung zwischen den Feldvariablen.
int[] array1 = {0,17,34,51,68,85}; int[] array2 = array1; if (array1[2] == array2[2]) System.out.println("Dieser Text sollte " + "ausgedruckt werden!"); |
Beide Variablen array1 und array2 zeigen auf dasselbe Feld
Durch das Zuweisen des null Werts werden die Referenzen gelöscht. Das Feld bleibt bestehen. Es wird jedoch gelöscht, wenn es keine andere Referenz mehr auf das Feld gibt.
array1 = null; array2 = null; |
Kopieren von Feldern
Das naive Kopieren von Feldern mit vollständiger Replikation kann man mit der erweiterten Notation der for Schleife leicht selbst implementieren:
int[] array1 = {0,17,34,51,68,85}; int[] array2 = new int[array1.length]; for (int i=0; i<array1.length; i++) {array2[i]= array1[i];} |
Alle Elemente des Felds werden einzelnen kopiert. Die erweiterte Notation erlaubt es die Anweisung ohne explizite Verwendung der Feldgröße anzugeben. Das Ergebnis hat eine Speicherstruktur wie folgt:
Eine effizientere Möglichkeit bildet die Methode System.arraycopy() aus der System Klasse. Diese Methode hat die folgende Signatur:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Sie erlaubt:
- von einem Feld src ab der Position srcPos
- in ein Feld dest an die Position destPos
- die Anzahl length Objekte zu kopieren
Das oben aufgeführte Beispiel würde wie folgt mit der Methode arrayCopy() implementiert:
int[] array1 = {0,17,34,51,68,85}; int[] array2 = new int[array1.length]; System.arrayCopy(array1,0,array2,0,array1.length);
Ausnahmen und Fehler bei Arbeiten mit Arrays (Feldern)
Beim Lesen und Manipulieren von Feldern können unterschiedliche Fehler auftreten. Sie können beim Über- oder Unterlauf eines Feldes auftreten oder bei dem Versuch Typen zuzuweisen die das Feld nicht erlaubt. Die folgenden Ausnahmen (Exceptions) können auftreten:
- IndexOutOfBoundsException: Der gewünschte Zugriff liegt ausserhalb des definierten Bereichs
- NullPointerException: Eine der Objektreferenzen ist ein null Zeiger
- ArrayStoreException: Ein Objekt welches gespeichert werden soll hat nicht den erlaubten Typ
- 7878 views
Fehler?
Fehlt hier bei dem Anlegen in 3 Schritten bei der for-Schleife, wo steht: {array[i] = i*17} nicht die 1 hinter array? Damit man sich auf das array1, welches deklariert wurde bezieht?
LG
Stimmt, danke
Wurde verbessert