Alle Argumente in Java werden als Wert übergeben. Wenn Sie einen Pass String
auf 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 zText
weist 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 zText
mit "foo"
angehängt enthält.
Das ursprüngliche Objekt wird nicht geändert, und die main()
lokale Variable der Methode zeigt zText
weiterhin 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 StringBuilder
einen Container (ein Array oder eine AtomicReference
oder 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, StringBuilder
erzielen 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 Strings
und nicht veränderlich weiterzugeben, StringBuilders
wenn 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.