Hallo,
ich hab da ein paar Fragen zur Speicherverwaltung in Java. Im Prinzip geht es mir darum, wie String im Heap gehandhabt werden,
wenn ihr Wert geändert wird, sowie um allgemeine Parameterübergabe. Gegeben sei die folgende Klasse:
In der Methode vertauschen sollen die Werte der Strings 'eins' und 'zwei' vertauscht werden. Die klassenweiten Strings 'a' und 'b' befinden sich im Constant Pool.
Die Frames der Methoden vertauschen und main enthalten daher einen Verweis auf den Constant Pool. Daher schaut die Speicherverwaltung VOR dem Anwenden
der Methode vertauschen so aus:
Constant Pool:
b = <adr2>
a = <adr1>
*main Frame:
args = <adr3>
Heap:
<adr1>: "A" <adr2>: "B <adr3>: {}
Hab ich das soweit schon einmal richtig verstanden?
So, nun wird die Methode vertauschen ausgeführt. Java übergibt ja eigentlich per Call by Value, aber bei Klassen tritt ja für gewöhnlich ein
Call by Reference Effekt auf, da nur die Speicheradresse der Klasse in die Methode kopiert wird, nicht der Wert selbst. Vor Beginng der Neuzuweisungen
schaut die Speicherverwaltung daher so aus:
Constant Pool:
b = <adr2>
a = <adr1>
*vertauschen Frame
temp = <adr4> // oder wird Temp gleich <adr1> zugeordnet?
zwei = <adr2>
eins = <adr1>
*main Frame:
args = <adr3>
Heap:
<adr1>: "A"
<adr2>: "B
<adr3>: {}
<adr4>: <adr1>
Nun sind aber Strings im Allgemeinen unveränderbar. Deshalb funktioniert die Methode vertauschen NICHT.
Das lokale String 'eins' enthält eine Referenz auf das Klassenstring (nenn man da so?) a.
Wird nun 'eins' ein neuer Wert zugewisen (a = zwei
, dann wird dem String 'eins' eine neue Adresse im Heap zugeordnet. Für 'zwei' gilt das gleiche.
Constant Pool:
b = <adr2>
a = <adr1>
*vertauschen Frame
temp = <adr4> // oder wird Temp gleich <adr1> zugeordnet?
zwei = <adr6>
eins = <adr5>
*main Frame:
args = <adr3>
Heap:
<adr1>: "A"
<adr2>: "B
<adr3>: {}
<adr4>: <adr1>
<adr5>: <adr2> // oder gleich "B" ?
<adr6>: <adr1> // oder gelich "A" ?
Und da die lokalen String eins und zwei nicht in im main-Frame sichtbar sind, funktioniert die Methode nicht.
Mir geht's nur darum, ob ich das richtig verstanden habe - was ich nämlich nicht glaube :noe: Wahrscheinlich blickt eh keiner durch bei dem was ich da zusammengefaselt habe, aber es wär zumindest nett, wenn mir jemand dann mit eigenen Worten erklärt, warum die Methode vertauschen nicht funktioniert.
Vielen Dank!
Gruß,
wertixx
ich hab da ein paar Fragen zur Speicherverwaltung in Java. Im Prinzip geht es mir darum, wie String im Heap gehandhabt werden,
wenn ihr Wert geändert wird, sowie um allgemeine Parameterübergabe. Gegeben sei die folgende Klasse:
Java:
public class Test {
public static String a="A";
public static String b="B";
public static void vertauschen (String eins, String zwei) {
String temp = eins;
eins = zwei;
zwei = temp;
}
public static void main (String args[]) {
vertauschen(a,b);
System.out.println("String a="+a);
System.out.println("String b="+b);
}
}
In der Methode vertauschen sollen die Werte der Strings 'eins' und 'zwei' vertauscht werden. Die klassenweiten Strings 'a' und 'b' befinden sich im Constant Pool.
Die Frames der Methoden vertauschen und main enthalten daher einen Verweis auf den Constant Pool. Daher schaut die Speicherverwaltung VOR dem Anwenden
der Methode vertauschen so aus:
Constant Pool:
b = <adr2>
a = <adr1>
*main Frame:
args = <adr3>
Heap:
<adr1>: "A" <adr2>: "B <adr3>: {}
Hab ich das soweit schon einmal richtig verstanden?
So, nun wird die Methode vertauschen ausgeführt. Java übergibt ja eigentlich per Call by Value, aber bei Klassen tritt ja für gewöhnlich ein
Call by Reference Effekt auf, da nur die Speicheradresse der Klasse in die Methode kopiert wird, nicht der Wert selbst. Vor Beginng der Neuzuweisungen
schaut die Speicherverwaltung daher so aus:
Constant Pool:
b = <adr2>
a = <adr1>
*vertauschen Frame
temp = <adr4> // oder wird Temp gleich <adr1> zugeordnet?
zwei = <adr2>
eins = <adr1>
*main Frame:
args = <adr3>
Heap:
<adr1>: "A"
<adr2>: "B
<adr3>: {}
<adr4>: <adr1>
Nun sind aber Strings im Allgemeinen unveränderbar. Deshalb funktioniert die Methode vertauschen NICHT.
Das lokale String 'eins' enthält eine Referenz auf das Klassenstring (nenn man da so?) a.
Wird nun 'eins' ein neuer Wert zugewisen (a = zwei
Constant Pool:
b = <adr2>
a = <adr1>
*vertauschen Frame
temp = <adr4> // oder wird Temp gleich <adr1> zugeordnet?
zwei = <adr6>
eins = <adr5>
*main Frame:
args = <adr3>
Heap:
<adr1>: "A"
<adr2>: "B
<adr3>: {}
<adr4>: <adr1>
<adr5>: <adr2> // oder gleich "B" ?
<adr6>: <adr1> // oder gelich "A" ?
Und da die lokalen String eins und zwei nicht in im main-Frame sichtbar sind, funktioniert die Methode nicht.
Mir geht's nur darum, ob ich das richtig verstanden habe - was ich nämlich nicht glaube :noe: Wahrscheinlich blickt eh keiner durch bei dem was ich da zusammengefaselt habe, aber es wär zumindest nett, wenn mir jemand dann mit eigenen Worten erklärt, warum die Methode vertauschen nicht funktioniert.
Vielen Dank!
Gruß,
wertixx
Zuletzt bearbeitet: