Achtung PROBLEM Referenz
Benötigtes Vorwissen
Arrays beinhalten grundsätzlich nicht die Werte des angegebenen Datentyps. Sie beinhalten (einfach ausgedrückt) lediglich den Zeiger bzw. Referenz auf den Speicherort dieser Werte. Die folgende Grafik soll das Ganze mal verdeutlichen. Wir verwenden wiederum unser Array arrayString.
public class ArrayTest {
public static void main(String[] args){
String[] arrayString = new String[3];
arrayString[0]="T";
arrayString[1]="S";
arrayString[2]="Ok";
System.out.println(arrayString[1]); //S
System.out.println(arrayString[2]); //Ok
}
}
Erlärngen zu Quelltext und Grafik
1. Zeile 3 legt den Bezeichner und Datentyp (einschließlich Arraylänge) fest
2. Die Zeilen 4-6 weisen den Speicherorten Werte des angegebenen Typs zu.
3. Die Speicheradressen aus 2. werden im Arraystack gespeichert.
4. In den Zeilen 7 und 8 wird der Compiler angewiesen, den Speicherinhalt der Speicherreferenz des Arrays auszugeben.
Problemstellung: "Array kopieren"
Die eigentliche Problemstellung taucht auf, wenn ein Array kopiert werden soll. Wird es wie folgt gemacht, wird das Problem offensichtlich:
public class ArrayTest {
public static void main(String[] args){
String[] arrayString = {"T","S","Ok"};
String[] arrayStringKopie;
arrayStringKopie = arrayString;
arrayStringKopie[1]="Neu";
System.out.println(arrayString[1]); //Neu
System.out.println(arrayStringKopie[1]); //Neu
}
}
In Zeile 4 wird ein zweites Array gleichen Typs initiiert aber nicht instanziert. Das geschieht erst in Zeile 5. In Zeile 4 wird (vereinfacht ausgedrückt) ein vollständiges Arraystack aufgebaut. In Zeile 5 wird den zweiten Array arrayStringKopie dieses Arraystack zugewiesen.
ACHTUNG: es wird das Arraystack zugewiesen nicht die Werte zugeordnet. Das neue Array arrayStringKopie zeigt auf dieselben Speicherorte wie arrayString das tut. Die Zeile 6 überschreibt jetzt über den Zeiger, der für beide Arrays gleivch ist, den Inhalt der Speicheradresse.
Lösung
Um die Werte eines Arrays in ein zweites Array "echt" zu kopieren, das heißt mit eigener neuer Speicheradresse, können die Werte in einer Schleife ausgelesen werden und dem zweiten Array zugeordnet werden:
public class ArrayTest {
public static void main(String[] args){
String[] arrayString = {"T","S","Ok"};
String[] arrayStringKopie = new String[arrayString.length];
for(int i=0; i<arrayString.length; i++){
arrayStringKopie[i] = arrayString[i];
}
arrayStringKopie[1]="Neu";
System.out.println(arrayString[1]); //S
System.out.println(arrayStringKopie[1]); //Neu
}
}
ODER
Wir nutzen Methoden, die wir der java.lang zu verdanken haben:
public class ArrayTest {
public static void main(String[] args){
String[] arrayString = {"T","S","Ok"};
String[] arrayStringKopie = arrayString.clone();
arrayStringKopie[1]="Neu";
System.out.println(arrayString[1]); //S
System.out.println(arrayStringKopie[1]); //Neu
}
}
Lizenziert unter Creative Commons Attribution Non-commercial Share Alike License 3.0