Все аргументы в Java передаются по значению. Когда вы передаете a String
в функцию, переданное значение является ссылкой на объект String, но вы не можете изменить эту ссылку, и базовый объект String является неизменным.
Назначение
zText += foo;
эквивалентно:
zText = new String(zText + "foo");
То есть он (локально) переназначает параметр zText
как новую ссылку, которая указывает на новую ячейку памяти, в которой находится новая, String
которая содержит оригинальное содержимое zText
с "foo"
добавленным.
Исходный объект не изменяется, а main()
локальная переменная метода по- zText
прежнему указывает на исходную (пустую) строку.
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);
}
}
печатает:
Original value:
Local value: foo
Final value:
Если вы хотите изменить строку, вы можете, как уже было отмечено, использовать StringBuilder
какой-либо контейнер (массив, AtomicReference
или пользовательский класс контейнера), который дает вам дополнительный уровень косвенности указателя. В качестве альтернативы просто верните новое значение и назначьте его:
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);
}
}
печатает:
Original value:
Local value: foo
Final value: foo
Вероятно, это наиболее похожее на Java решение в общем случае - см. Пункт « Эффективная Java » «Постоянная предпочтительность».
Тем не менее, как уже отмечалось, StringBuilder
часто это даст вам лучшую производительность - если у вас есть много возможностей добавления, особенно внутри цикла, используйте StringBuilder
.
Но попробуйте обойтись неизменяемым, Strings
а не изменяемым, StringBuilders
если вы можете - ваш код будет легче читать и легче поддерживать. Подумайте о final
настройке параметров и настройке среды IDE для предупреждения о переназначении параметра метода на новое значение.