Java中的所有参数均按值传递。当您将a传递String
给函数时,传递的值是对String对象的引用,但是您不能修改该引用,并且基础String对象是不可变的。
那作业
zText += foo;
等效于:
zText = new String(zText + "foo");
也就是说,它(在本地)将参数重新分配zText
为新的引用,该参数指向新的内存位置,其中的新String
内容zText
包含"foo"
附加了with 的原始内容。
原始对象没有被修改,并且该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以在将方法参数重新分配给新值时向您发出警告。