Zuweisung verändert den Ausgangswert

polarpro

Mitglied
Hallo,

ich steh vor einem Rätsel... Um es kurz zu machen:
Ich habe eine simple Tabelle ("kunden"), suche dort bestimmte Elemente und gebe die gefundenen Elemente in einer neuen Tabelle ("ergebnis") aus.

Der Faulheit halber habe ich meine ergebnis-Tabelle zunächst mit
Java:
String[][] ergebnis = kunden;
initialisiert,
das hatte zur Folge, dass jedoch auch meine Ausgangstabelle verändert wurde. (Zum Ausdruck habe ich dann eh nur die gefundenen Zeilen der ergebnis-Tabelle verwendet.)

Als ich dann
Java:
String[][] ergebnis = new String[kunden.length][kunden[0].length];
verwendet habe, hat alles wie gewünscht funktioniert.

Ich habe den Code hier angegeben und ihn vereinfacht.
Zeile 17 beinhaltet den nicht funktionierenden Code,
Zeile 14 (auskommentiert) beinhaltet den in meinem Sinne funktionierenden Code.

Ich habe mir die Zähne ausgebissen, echt.
Weiß jemand, weshalb bei der "schlechten" Lösung auch die Inhalte in der Ausgangstabelle geändert werden?

Viele Grüße... ???:L

Java:
class KV1
{
	public static void main(String args[])
	{
		String[][] kunden = {{"001","Aname","Bvorname","Cort"},
					    	 {"002","Dname","Avorname","Bort"},
					    	 {"003","Cname","Dvorname","Aort"},
					    	 {"004","Bname","Cvorname","Dort"},
					    	 {"005","Dname","Avorname","Bort"},
					    	 {"006","Cname","Dvorname","Aort"},
					    	 {"007","Bname","Cvorname","Dort"}};
		
		//So funktioniert's:
		//String[][] ergebnis = new String[kunden.length][kunden[0].length];
		
		//So funktioniert's nicht:
		String[][] ergebnis = kunden;
		
		int ergebnis_zeile = 0;
		
		int suchfeld = 3;
		String suchbegriff = "Aort";
		
		//Kunden-Tabelle VOR der Suche:
		System.out.println();
		System.out.println("Kunden-Tabelle VOR der Suche:");
		for(int i=0 ; i<kunden.length ; i++)
		{
			for(int j=0 ; j<kunden[0].length ; j++)
				System.out.print(kunden[i][j] + " ");
			System.out.println();
		}
		
		//Ergebnis-Tabelle VOR der Suche:
		System.out.println();
		System.out.println("Ergebnis-Tabelle VOR der Suche:");
		for(int i=0 ; i<ergebnis.length ; i++)
		{
			for(int j=0 ; j<ergebnis[0].length ; j++)
				System.out.print(ergebnis[i][j] + " ");
			System.out.println();
		}
	
		//SUCHE:
		System.out.println();
		System.out.println("Suche:");
		for(int i=0 ; i<kunden.length ; i++)
		{
			if(suchbegriff.compareTo(kunden[i][suchfeld]) == 0)
			{
				System.out.println("Treffer in Zeile (Position) " + i);
				ergebnis[ergebnis_zeile] = kunden[i]; //Fügt die gefundene Zeile aus kunden-Tabelle in die entsprechende Zeile in ergebnis-Tabelle
				ergebnis_zeile++;
			}
		}
		
		//Ergebnis-Tabelle NACH der Suche:
		System.out.println();
		System.out.println("Ergebnis-Tabelle NACH der Suche:");
		for(int i=0 ; i<ergebnis.length ; i++)
		{
			for(int j=0 ; j<ergebnis[0].length ; j++)
				System.out.print(ergebnis[i][j] + " ");
			System.out.println();
		}
	
		//Kunden-Tabelle NACH der Suche:
		System.out.println();
		System.out.println("Kunden-Tabelle NACH der Suche:");
		for(int i=0 ; i<kunden.length ; i++)
		{
			for(int j=0 ; j<kunden[0].length ; j++)
				System.out.print(kunden[i][j] + " ");
			System.out.println();
		}
	
	}

}

Ergebnis mit der schlechten Lösung:


Kunden-Tabelle VOR der Suche:
001 Aname Bvorname Cort
002 Dname Avorname Bort
003 Cname Dvorname Aort
004 Bname Cvorname Dort
005 Dname Avorname Bort
006 Cname Dvorname Aort
007 Bname Cvorname Dort

Ergebnis-Tabelle VOR der Suche:
001 Aname Bvorname Cort
002 Dname Avorname Bort
003 Cname Dvorname Aort
004 Bname Cvorname Dort
005 Dname Avorname Bort
006 Cname Dvorname Aort
007 Bname Cvorname Dort

Suche:
Treffer in Zeile (Position) 2
Treffer in Zeile (Position) 5

Ergebnis-Tabelle NACH der Suche:
003 Cname Dvorname Aort
006 Cname Dvorname Aort
003 Cname Dvorname Aort
004 Bname Cvorname Dort
005 Dname Avorname Bort
006 Cname Dvorname Aort
007 Bname Cvorname Dort

Kunden-Tabelle NACH der Suche:
003 Cname Dvorname Aort
006 Cname Dvorname Aort

003 Cname Dvorname Aort
004 Bname Cvorname Dort
005 Dname Avorname Bort
006 Cname Dvorname Aort
007 Bname Cvorname Dort


Ergebnis mit der guten Lösung:


Kunden-Tabelle VOR der Suche:
001 Aname Bvorname Cort
002 Dname Avorname Bort
003 Cname Dvorname Aort
004 Bname Cvorname Dort
005 Dname Avorname Bort
006 Cname Dvorname Aort
007 Bname Cvorname Dort

Ergebnis-Tabelle VOR der Suche:
null null null null
null null null null
null null null null
null null null null
null null null null
null null null null
null null null null

Suche:
Treffer in Zeile (Position) 2
Treffer in Zeile (Position) 5

Ergebnis-Tabelle NACH der Suche:
003 Cname Dvorname Aort
006 Cname Dvorname Aort
null null null null
null null null null
null null null null
null null null null
null null null null

Kunden-Tabelle NACH der Suche:
001 Aname Bvorname Cort
002 Dname Avorname Bort

003 Cname Dvorname Aort
004 Bname Cvorname Dort
005 Dname Avorname Bort
006 Cname Dvorname Aort
007 Bname Cvorname Dort
 

Wildcard

Top Contributor
Variablen sind nur Zeiger auf Objekte, sie beeinhalten nicht die Werte selbst.
String[][] ergebnis = kunden;
Du hast jetzt 2 Zeiger auf das gleiche Array, einer heißt ergebnis, der andere kunden. Egal über welchen dieser Zeiger du auf dein Array zugreifst, es ist immer noch das selbe Array. Jetzt klarer?
 

polarpro

Mitglied
Aha...

das heißt also, irgendwo im Speicher habe ich das Element mit "001","Aname","Bvorname","Cort" gespeichert, und wenn ich über die Variable ergebnis-Tabelle diesen Wert im Speicher ändere, zeigt auch kunden-Tabelle diesen veränderten Wert.

Hm. Kann es sein, dass das nur für Arrays gilt? Deine Info in vereinfachter Form sieht so aus:
Java:
int[] tabelle1 = {1,2,3};
int[] tabelle2 = tabelle1;
tabelle2[0] = 9;
System.out.println(tabelle1[0]);
Wie erwartet erscheint dann 9 auf dem Bildschirm. Mit
Java:
int x=3;
int y=x;
y=4;
System.out.println(x);
bleibt x jedoch bei 3.
 

Wildcard

Top Contributor
int ist ein primitiver Wert, genau wie double, boolean,...
Variablen enthalten entweder primitive Werte, oder Referenzen auf Objekte (Arrays sind auch Objekte).
int x=3;
int y=x;
Der Wert 3 wird auf y kopiert

int[] tabelle1 = {1,2,3};
int[] tabelle2 = tabelle1;
Die Referenz auf das Array {1,2,3} wird kopiert, tabelle1 und tabelle2 zeigen also auf das gleiche Objekt
 

polarpro

Mitglied
O.k., jetzt kommt langsam Licht in die Sache... :)

Strings scheinen mir jedoch eine Ausnahme zu bilden.

Java:
String a="abc";
String b=a;
b="xyz";
System.out.println(a);

liefert abc als Ergebnis. Als Objekt hätte ich xyz erwartet...
 

Painii

Bekanntes Mitglied
Strings sind auch wieder ne Besonderheit (immutable Objects).

Wäre das bei String nicht der Fall hättest du Recht, dann würde "xyz" ausgegeben werden.
 

Empire Phoenix

Top Contributor
immutable Objects ->
effectiv kannste dir das so vorstellen bei Strings:

String a=new STring("abc");
String b=a;
b= new STring("xyz");
System.out.println(a);

womit dann wirklich 2 objecte erstellt werden. (Achtung das ist nicht ganz korrect, muss dazu gesagt werden bei der "" erstellung landen Strings noch in einen Pool, falls die nochmal gebraucht werden)
 

polarpro

Mitglied
O.k., Danke, dann ist mir jetzt einiges klarer. Ist letztlich genau so, wie wenn ich einen Eingabeparameter verwende: Ist dieser einfachen Typs, dann wird der Wert der schon vorhandenen Variable in einer "echten Kopie" übergeben; ist mein Eingabeparameter hingegen ein Array, dann wird nur eine Referenz auf das Array übergeben und alle Änderungen finden direkt im Array statt.

Und Strings spielen ein wenig eine Sonderrolle, da sie eigentlich nicht verändert werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Wert zuweisung Allgemeine Java-Themen 1
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
A Observer Pattern: feuern bei neuer Referenz-Zuweisung? Allgemeine Java-Themen 8
Semox Fehler - Zuweisung aus BufferedReader an Variable Allgemeine Java-Themen 3
ARadauer zuweisung ergibt doch true, oder? Allgemeine Java-Themen 17
D Was ist schneller? Zuweisung oder Vergleich? Allgemeine Java-Themen 18
R ascii-wert zuweisung Allgemeine Java-Themen 4
T Problem mit Zuweisung von Objekten Allgemeine Java-Themen 5
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
J String Variable verändert sich plötzlich Allgemeine Java-Themen 8
S Best Practice System.arrayCopy verändert Ziel-Array Allgemeine Java-Themen 2
T Static kann nicht verändert werden Allgemeine Java-Themen 3
pg1337 hashCode() verändert sich Allgemeine Java-Themen 15
X Über ArrayList iterieren, während sich diese verändert Allgemeine Java-Themen 3
F Wie verändert sich die Göße einer verschlüsselten Datei? Allgemeine Java-Themen 2
M JTable verändert Position auf meinem JPanel Allgemeine Java-Themen 3
C Übergabe Parameter verändert Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben