Speicherverwaltung bei Strings

Status
Nicht offen für weitere Antworten.

wertixx

Mitglied
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:

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;), 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
 
Zuletzt bearbeitet:

fastjack

Top Contributor
Es gibt eigentlich nur zwei Regeln :

1. Stringliterale kommen in den ConstantPool.
Java:
String s = "lala";

2. Strings aus String-Objekten kommen auf den Heap und in den ConstantPool.
Java:
String s = new String("lala");
 

ModellbahnerTT

Bekanntes Mitglied
Das was du da zusammengefaselt hast hättst du dir auch sparen können, in Java gibt es nur Call by Value darum funktioniert dein Code nicht.
Strings liegen zur Laufzeit natürlich wie alle anderen Objekte auf dem Heap.
 

wertixx

Mitglied
Ja, das ist schon klar, aber gibt es bei Klassen für gewöhnlich doch einen Call-by-Reference EFFEKT, da eben nicht der ganze Wert, sondern nur die Referenz, also die Speicheradresse, kopiert wird.

Hätte ich jetzt ein Array als Parameter übertragen würde das wunderbar klappen, meine Frage ist, warum dass nicht bei Strings funktioniert!
 

ModellbahnerTT

Bekanntes Mitglied
Das ist richtig.
Trotzdem bitte nicht den ConstantPool unterschlagen.

check this : JavaRanch Journal - September 2004 Volume 3 Issue 7 :rtfm:
Der Constant Pool ist eine Einheit in class Dateien und hat zur Laufzeit keine Bedeutung. Wenn du Strings noch weiter einordnen willst kannst du sagen sie liegen im Perm Space im Heap, hat für das Problem aber genausowenig relevanz.

Weil Strings immutable objects sind. immutable : Java Glossary
Ist zwar richtig aber als Antwort für die Frage blödsinnig, schließlich hab ich das selbe Problem mit einer normalen nicht immutable Klasse.

Ja, das ist schon klar, aber gibt es bei Klassen für gewöhnlich doch einen Call-by-Reference EFFEKT, da eben nicht der ganze Wert, sondern nur die Referenz, also die Speicheradresse, kopiert wird.

Hätte ich jetzt ein Array als Parameter übertragen würde das wunderbar klappen, meine Frage ist, warum dass nicht bei Strings funktioniert!
Der "Effekt" ist, dass du innerhalb der Methode mit dem gleichen Objekt wie der Aufrufer arbeitet, das heißt noch nicht, dass das irgendwen interessiert wenn du die Referenz in der Methode versuchst umzubiegen.
Mit Arrays hättest du übrigens genau das gleiche Problem.
public static void vertauschen (Object[] eins, Object[] zwei) {
Object[] temp = eins;
eins = zwei;
zwei = temp;
}
Ist aber schon klar was du meinst...
 

faetzminator

Gesperrter Benutzer
Nunja, davon ausgegangen, dass man einen Container um ein Immutable oder eine sonstige Klasse mit Werten hat, kann man das folgendermassen lösen (darum ist meine Antwort nicht grundlegend falsch):
Java:
public class Foo<T> {

    private T data;

    public Foo(T data) {
        this.setData(data);
    }

    public void setData(T data) {
        this.data = data;
    }

    public T getData() {
        return this.data;
    }
    
    @Override
    public String toString() {
        return data == null ? "null" : data.toString();
    }

    public static <T> void switchObj(Foo<T> a, Foo<T> b) {
        T data = a.getData();
        a.setData(b.getData());
        b.setData(data);
    }

    public static void main(String[] args) {
        Foo<String> a = new Foo<String>("A");
        Foo<String> b = new Foo<String>("B");
        Foo.switchObj(a, b);
        System.out.println("Foo a=" + a);
        System.out.println("Foo b=" + b);
    }
}
 

wertixx

Mitglied
Mit Arrays hab ich nicht das gleiche Problem...

Java:
public class Test2 {

	public static String a="A";
	public static String b="B";
	public static String[] neu = {a,b};

	public static void vertauschen (String[] s) {
		String temp=s[0];
		s[0]=s[1];
		s[1]=temp;
	}

	public static void main (String args[]) {
		vertauschen(neu); 
		System.out.println("String a="+neu[0]);
		System.out.println("String b="+neu[1]);

	}
}

Hier wird aber definitiv:

String a = B
String b = A

ausgegeben!
 

faetzminator

Gesperrter Benutzer
ja, das Array ist ja immer noch das gleiche, du referenzierst es nicht neu. Gleich wie in meinem Beispiel hast du da eine Referenz, welche übergeben wird, welche sich nicht ändert. Lediglich inhaltlich ändern sich die Objekte - dieser wird vertauscht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Speicherverwaltung Java Basics - Anfänger-Themen 7
K Speicherverwaltung in Java Java Basics - Anfänger-Themen 9
C Speicherverwaltung für Felder Java Basics - Anfänger-Themen 8
N Anfängerfrage bezüglich Speicherverwaltung Java Basics - Anfänger-Themen 3
G Speicherverwaltung Java Basics - Anfänger-Themen 3
0 Dynamische Speicherverwaltung Java Basics - Anfänger-Themen 4
C Speicherverwaltung Java Basics - Anfänger-Themen 12
W Gleichzeitiges ersetzen mehrerer Strings Java Basics - Anfänger-Themen 7
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
N Nachkommastellen von Strings Java Basics - Anfänger-Themen 3
T Strings unveränderlich???? Java Basics - Anfänger-Themen 22
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
S Die durchschnittliche Länge der Strings Java Basics - Anfänger-Themen 11
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
sserio StringBuilder und Strings Java Basics - Anfänger-Themen 8
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
N Strings verpflechten Java Basics - Anfänger-Themen 4
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
L Strings aneinanderhängen Java Basics - Anfänger-Themen 2
M Strings vergleichen Java Basics - Anfänger-Themen 10
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
P Verketten, Aneinanderreihen von Strings Java Basics - Anfänger-Themen 2
M Strings mit gerader und ungerader Länge ausgeben Java Basics - Anfänger-Themen 10
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
W Strings und das parsen Java Basics - Anfänger-Themen 8
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
D Vergleichen von Strings Java Basics - Anfänger-Themen 6
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Abbruchbedingung in Schleife/ Untersuchung von Strings Java Basics - Anfänger-Themen 2
S Buchstaben in Großbuchstaben (Strings) Java Basics - Anfänger-Themen 5
X Anagramm mit Strings und Methode Java Basics - Anfänger-Themen 53
P geschachtelte Schleife mit Strings Java Basics - Anfänger-Themen 2
P Strings mit der Axt zerteilen Java Basics - Anfänger-Themen 7
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
K Strings hochzählen Java Basics - Anfänger-Themen 20
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
J Unveränderbarkeit von Strings Java Basics - Anfänger-Themen 3
O Klammerung bei Strings Java Basics - Anfänger-Themen 10
A Liste aus drei Strings erstellen Java Basics - Anfänger-Themen 5
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
D ergebnis.matches("[1-9]?[0-9].[0-9][0-9]?") ein teil eines größeren Strings Java Basics - Anfänger-Themen 12
J Breite eines Strings bestimmen Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
F JList Elemente mit Strings vergleichen Java Basics - Anfänger-Themen 12
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
B mir nur die Gesamtzahl von einzigartigen Strings aus Array ausgeben lassen Java Basics - Anfänger-Themen 5
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
F Maximale Länge eines Strings Java Basics - Anfänger-Themen 5
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
Jinnai4 Strings ersetzen Java Basics - Anfänger-Themen 9
R Übergeben eines Array Strings an einen Spinner Java Basics - Anfänger-Themen 4
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Variablen Zahlen aus Strings auslesen Java Basics - Anfänger-Themen 4
C 2 Strings Java Basics - Anfänger-Themen 15
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
JavaNewbie2.0 Strings in andere Klassen importieren. Java Basics - Anfänger-Themen 2
D BlueJ Java: Strings voneinander trennen Java Basics - Anfänger-Themen 11
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
R Erste Schritte Strings "einrücken" Java Basics - Anfänger-Themen 3
Yamie ArrayList<Object> als Liste von Strings ausgeben? Java Basics - Anfänger-Themen 15
B gemeinsames Vorkommen der charactere von 2 Strings als String zurückgeben Java Basics - Anfänger-Themen 5
R Teilinhalt eines Strings testen Java Basics - Anfänger-Themen 10
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
L Werte von Strings ? Java Basics - Anfänger-Themen 1
L Strings und Arrays - Expand Java Basics - Anfänger-Themen 12
I Schachbrett aus beliebigen Strings erstellen Java Basics - Anfänger-Themen 3
Syncopated Pandemonium Verketten von Strings funktioniert nicht Java Basics - Anfänger-Themen 4
F Wahrscheinlichkeit von Strings Java Basics - Anfänger-Themen 3
MiMa Splitten eines Strings Java Basics - Anfänger-Themen 5
T Hashfunktion für Strings Java Basics - Anfänger-Themen 3
C Zeilenumbruch für langes Strings Java Basics - Anfänger-Themen 2
J Variablen Strings mit Zeilenumbrüchen in neues Array Element Java Basics - Anfänger-Themen 1
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
H Strings vergleichen & sortieren Java Basics - Anfänger-Themen 20
H Erste Schritte Längstes Wort eines Strings herausfinden Java Basics - Anfänger-Themen 7
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
G Strings mit Scanner (nextLine) einlesen Java Basics - Anfänger-Themen 7
T Strings ersetzen mit \ Java Basics - Anfänger-Themen 10

Ähnliche Java Themen


Oben