str
ist kein Objekt, es ist ein Verweis auf ein Objekt. "Hello"
und "Help!"
sind zwei verschiedene String
Objekte. Zeigt also str
auf eine Zeichenfolge. Sie können ändern, auf was es zeigt , aber nicht auf das, worauf es zeigt .
Nehmen Sie diesen Code zum Beispiel:
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
Jetzt gibt es nichts 1 wir tun könnten , um s1
die den Wert beeinflussen würde s2
. Sie beziehen sich auf dasselbe Objekt - die Zeichenfolge "Hello"
-, aber dieses Objekt ist unveränderlich und kann daher nicht geändert werden.
Wenn wir so etwas machen:
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
Hier sehen wir den Unterschied zwischen dem Mutieren eines Objekts und dem Ändern einer Referenz. s2
zeigt immer noch auf dasselbe Objekt, auf das wir ursprünglich s1
zeigen wollten. Wenn Sie festlegen s1
, dass "Help!"
nur die Referenz geändert String
wird, bleibt das Objekt, auf das ursprünglich verwiesen wurde, unverändert.
Wenn Strings waren wandelbar, könnten wir so etwas tun:
String s1 = "Hello";
String s2 = s1;
s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string
System.out.println(s2); // Prints "Hallo"
Bearbeiten, um auf die Bearbeitung von OP zu reagieren:
Wenn Sie sich den Quellcode für String.replace (char, char) ansehen (auch in src.zip in Ihrem JDK-Installationsverzeichnis verfügbar - ein Tipp ist, wenn Sie sich fragen, wie etwas wirklich funktioniert), können Sie sehen, was es ist das Folgende:
- Wenn
oldChar
die aktuelle Zeichenfolge ein oder mehrere Vorkommen von enthält , erstellen Sie eine Kopie der aktuellen Zeichenfolge, durch die alle Vorkommen von oldChar
ersetzt werden newChar
.
- Wenn das
oldChar
in der aktuellen Zeichenfolge nicht vorhanden ist, geben Sie die aktuelle Zeichenfolge zurück.
Also ja, "Mississippi".replace('i', '!')
erstellt ein neues String
Objekt. Auch hier gilt:
String s1 = "Mississippi";
String s2 = s1;
s1 = s1.replace('i', '!');
System.out.println(s1); // Prints "M!ss!ss!pp!"
System.out.println(s2); // Prints "Mississippi"
System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects
Ihre Hausaufgabe ist es, zu sehen, was der obige Code bewirkt, wenn Sie s1 = s1.replace('i', '!');
zu s1 = s1.replace('Q', '!');
:) wechseln.
1 Eigentlich ist es ist möglich , zu mutieren Strings (und andere unveränderliche Objekte). Es erfordert Reflexion und ist sehr, sehr gefährlich und sollte niemals verwendet werden, es sei denn, Sie sind tatsächlich daran interessiert, das Programm zu zerstören.