Alle Argumente in Java werden als Wert übergeben. Wenn Sie einen Pass Stringauf eine Funktion, dass der Wert übergeben werden ist ein Verweis auf ein String - Objekt, aber Sie können diese Referenz nicht ändern, und das zugrundeliegende String - Objekt ist unveränderlich.
Die Zuordnung
zText += foo;
ist äquivalent zu:
zText = new String(zText + "foo");
Das heißt, es zTextweist den Parameter (lokal) als neue Referenz neu zu, die auf einen neuen Speicherort verweist, in dem sich ein neuer befindet String, der den ursprünglichen Inhalt von zTextmit "foo"angehängt enthält.
Das ursprüngliche Objekt wird nicht geändert, und die main()lokale Variable der Methode zeigt zTextweiterhin auf die ursprüngliche (leere) Zeichenfolge.
class StringFiller {
static void fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
fillString(zText);
System.out.println("Final value: " + zText);
}
}
Drucke:
Original value:
Local value: foo
Final value:
Wenn Sie die Zeichenfolge ändern möchten, können Sie wie angegeben StringBuildereinen Container (ein Array oder eine AtomicReferenceoder eine benutzerdefinierte Containerklasse) verwenden, der Ihnen eine zusätzliche Ebene der Zeiger-Indirektion bietet. Alternativ geben Sie einfach den neuen Wert zurück und weisen ihn zu:
class StringFiller2 {
static String fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
return zText;
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
zText = fillString(zText);
System.out.println("Final value: " + zText);
}
}
Drucke:
Original value:
Local value: foo
Final value: foo
Dies ist wahrscheinlich die Java-ähnlichste Lösung im allgemeinen Fall - siehe den effektiven Java- Punkt "Unveränderlichkeit begünstigen".
Wie bereits erwähnt, StringBuildererzielen Sie jedoch häufig eine bessere Leistung. Wenn Sie viel anhängen müssen, insbesondere innerhalb einer Schleife, verwenden Sie StringBuilder.
Versuchen Sie jedoch, unveränderlich Stringsund nicht veränderlich weiterzugeben, StringBuilderswenn Sie können - Ihr Code ist leichter zu lesen und besser zu warten. Überlegen Sie final, ob Sie Ihre Parameter festlegen und Ihre IDE so konfigurieren möchten, dass Sie gewarnt werden, wenn Sie einen Methodenparameter einem neuen Wert zuweisen.