Wszystkie argumenty w Javie są przekazywane według wartości. Gdy przekazujesz a Stringdo funkcji, przekazana wartość jest odwołaniem do obiektu String, ale nie możesz zmodyfikować tego odwołania, a bazowy obiekt String jest niezmienny.
Przydzial
zText += foo;
jest równa:
zText = new String(zText + "foo");
Oznacza to, że (lokalnie) ponownie przypisuje parametr zTextjako nowe odniesienie, które wskazuje na nowe miejsce w pamięci, w którym jest nowe, Stringktóre zawiera oryginalną zawartość zTextz "foo"dołączoną.
Oryginalny obiekt nie jest modyfikowany, a main()zmienna lokalna metody zTextnadal wskazuje na oryginalny (pusty) ciąg.
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);
}
}
wydruki:
Original value:
Local value: foo
Final value:
Jeśli chcesz zmodyfikować ciąg, możesz, zgodnie z opisem, StringBuilderlub jakiś kontener (tablicę lub AtomicReferenceniestandardową klasę kontenera), który zapewnia dodatkowy poziom niezależności wskaźnika. Alternatywnie, po prostu zwróć nową wartość i przypisz ją:
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);
}
}
wydruki:
Original value:
Local value: foo
Final value: foo
Jest to prawdopodobnie najbardziej podobne do Javy rozwiązanie w ogólnym przypadku - zobacz Efektywny element Java „Korzystna niezmienność”.
Jak już wspomniano, StringBuilderczęsto zapewnia lepszą wydajność - jeśli masz dużo do zrobienia, szczególnie wewnątrz pętli, użyj StringBuilder.
Ale spróbuj przekazać niezmienne, Stringsa nie zmienne, StringBuildersjeśli możesz - Twój kod będzie łatwiejszy do odczytania i łatwiejszy w utrzymaniu. Rozważ utworzenie parametrów finali skonfigurowanie środowiska IDE, aby ostrzegało Cię, gdy ponownie przypisujesz parametr metody do nowej wartości.