2010-08-03 12 views
6
String s = ...; 

s = s.substring(1); 

Ist das möglich? Ich dachte, Sie können ein String-Objekt in Java nicht ändern.Sind String-Objekte in Java nicht unveränderbar?

+1

Sie wären richtig, wenn nur 'sstring (1)' die Zeichenfolge in 's ändern würde. Aber Sie weisen 's' einen neuen String zu. –

+1

Sie ändern nur die Referenz s, nicht die ursprüngliche Zeichenfolge selbst.Ein kleiner Stilpunkt - es ist oft besser, eine neue, beschreibend benannte lokale Variable zu erstellen, anstatt Variablen wie diese erneut zu verwenden. – mikera

+6

Verwechseln Sie die Objekte nicht mit den Referenzen. Objekte können veränderlich oder unveränderlich sein. Referenzen können "final" sein oder nicht. Die Bezugnahme auf "final" macht das Objekt nicht unveränderlich. Unveränderbare Objekte können durch Referenzen bezeichnet werden, die nicht "final" sein müssen. – polygenelubricants

Antwort

23

String-Objekte sind unveränderbar. String Referenzen sind jedoch veränderbar. Oben ist s eine Referenz.

+1

+1 kurz und richtig. Der Anfangswert von s ist immer noch da, unverändert und möglicherweise jetzt nicht referenziert, im Speicher - darauf wartend, GC'd zu erhalten. Die Referenz s zeigt jedoch nun auf ein neues, ebenfalls unveränderliches Objekt, das von der Substring-Methode erzeugt wurde. – delnan

+3

Dang, ich wünschte, ich hätte dieses Q vor dir gesehen, um mir einen Haufen einfacher Wiederholung zu besorgen. :) +1 – iandisme

2

Hier erstellen Sie eine neue Zeichenfolge und weisen sie einer bereits verwendeten Referenz zu. Die ursprüngliche Zeichenfolge, auf die sich bezogen wird, ist Garbage Collected. Es wurden keine Strings geändert.

+0

Müll gesammelt? –

4

String-Objekte sind unveränderlich, was bedeutet, dass sich der Wert instance, auf den sich s bezieht, nicht ändern kann.

Ihr Code mutiert die Instanz nicht.
Stattdessen wird die s Referenz geändert, um auf eine neue String-Instanz zu verweisen.

Zum Beispiel:

String a = "1"; 
String b = a; 
a = "2"; 

Nach Ausführen dieses Code ist b noch "1".
Die Zeile b = a setzt b, um auf dieselbe "1" Instanz zu verweisen, auf die sich a derzeit bezieht.
Wenn Sie anschließend a = "2" schreiben, ändern Sie die a Variable so, dass sie auf eine andere ("2") Instanz verweist.
Die ursprüngliche "1" Instanz, auf die sich b noch bezieht, hat sich jedoch nicht geändert.

4

Ja, String Objekte sind unveränderlich.

Die Variable s ist eine Referenz auf ein Objekt, und die Referenz selbst kann das Objekt, auf das sie zeigt, ändern. Die Neuzuweisung der Referenz wirkt sich nicht auf das Objekt aus, auf das sie zeigt.

Die Methode gibt tatsächlich eine neue Instanz eines String zurück, sodass das ursprüngliche Objekt String unverändert bleibt.

Das folgende ist ein einfaches Beispiel zu zeigen, dass die ursprünglichen String nicht durch die substring Methode verändert ::

String s = "Hello!"; 
s.substring(1); 

System.out.println(s); // Prints "Hello!" 

Das obige Beispiel druckt „Hallo!“ weil die substring Methode wird zurückgeben eine neue String eher als die ursprüngliche auswirken. Das Original String kann nicht geändert werden, da es unveränderlich ist.

Vergleiche die oben mit dem folgenden:

String s = "Hello!"; 
s = s.substring(1); 

System.out.println(s); // Prints "ello!" 

In diesem Beispiel wird der Verweis auf s an die vom substring Methode zurückgegeben String verändert, so dass, wenn die mit s zugehörigen String durch `-System gedruckt wird. out.println "wird die ausgegebene Zeichenfolge" ello!"

0

So:

String foo = "foo"; 
foo.substring(1); 
System.out.println(foo); 

//of course.. 
foo = "aa"; 
System.out.println(foo); 
0

Wenn Sie String s = verwenden "abc", können Sie einen String Verweis auf ein String-Objekt erstellen, die den unveränderlichen Wert "abc"

Dann, wenn Sie. Sagen Sie s = sstring (1); Sie weisen einem neu erstellten String-Objekt s zu, das "bc" enthält - aber das ursprüngliche Objekt ist unverändert.

Dies ist eine häufige Fehlerursache, weil Sie dies nicht tun Weisen Sie den Wert zu, erhalten Sie möglicherweise unerwartete Ergebnisse.

Viele Anfänger Java-Entwickler werden solche Methoden wie trim() verwenden und nicht erkennen, dass trim() die Zeichenfolge nicht beeinflusst.

s.trim() < - Nichts zu s, gibt eine getrimmte Zeichenfolge zurück - das ist ein Fehler.

s = s.trim() < - Speichert die getrimmte Zeichenfolge - das ist korrekt.

0

Test-it:

String s = "Test"; 
String j = s; 

s = s.substring(1); 

s ist jetzt T und j ist noch Test.

2

// Erstellen Sie einen Verweis s String "Hallo"

String s = "Hallo";

// Now Druckunterfolge der Zeichenfolge durch s bezeichnet

System.out.println (s.subString (1));

// Druckvorschau String bezeichnet durch s

System.out.println (s);

Das obige Codefragment würde erster Druck H und dann auf zweite Linie wird es Hallo drucken. Jetzt Warum hat es zuerst gedruckt H? : Sache ist subString() Methode gibt einen String * zurück, ohne die Zeichenfolge zu ändern, die durch Verweis s * verwiesen wird. s bezieht sich immer noch auf "Hallo". Wenn Sie jetzt versuchen, s zu drucken, wird die Zeichenfolge gedruckt, auf die s verweist. auf diese Weise String "Hello" ist immuable. Sie können es nur verwenden, um eine andere Zeichenfolge zu erzeugen, aber Sie können sie nicht mutieren.

Bei Verwendung der Anweisung s = sString (1); Was Sie tun, ist, dass s bezieht sich jetzt auf eine subString() von "Hallo", aber "Hallo" selbst ist noch nicht geändert.

Verwandte Themen