检查此代码
public class StringbuilderDoubt {
public static void main(String args[]){
new StringbuilderDoubt().methodTest();
}
public void methodTest(){
String str=new String("Default");
StringBuilder sb=new StringBuilder();
sB1(str,sb);
sB2(str,sb);
System.out.println(str+".........."+sb);
}
private void sB1(String str1, StringBuilder sb1){
str1+="str1";
sb1.append("sB1");
}
private void sB2(String str2, StringBuilder sb2){
str2+="str2";
sb2.append("sB2");
}
}
输出为:Default..........sB1sB2
为什么StringBuilder像传递引用一样工作?
在methodTest中,我传递了两个对象字符串和字符串构建器。字符串是按值传递的,但StringBuilder看起来像是通过refence传递,而StringBuilder对象来自调用方法的更改。
答案 0 :(得分:1)
我在这里看到StringBuilder
没有任何问题。
str
引用引用的字符串没有任何反应。在sB1
方法中,您有一个本地参考str1
。 “+ =”运算符返回一个新的String,但原始字符串是不可变的,不会更改。您的sB2
方法也会发生同样的事情。
因此,您的变量str
仍然只包含“默认”。
答案 1 :(得分:1)
将StringBuilder实例传递给方法时,实例值按值传递。如您所见,您可以将字符附加到方法内的StringBuilder实例,而不返回实例值。
如果需要,您还可以返回StringBuilder实例值,但这不是必需的。它没有改变。
这个“按引用传递”也适用于大多数Collection类(List,Map),以及适用于拥有getter和setter的类。
如果您不想要此行为,则必须对传递的实例进行深层复制。如果从公共API返回Collection类,则可以执行此操作。
答案 2 :(得分:0)
因为是通过引用传递。 StringBuilder
的引用按值传递。您可以添加字符,它们将在方法返回后出现在实例中。您可以通过相同的方式传递Collection并在invoke方法中添加值 - 这些将被保留。您也可以调用setter或指定公共字段,这些更改也会在返回后保留。
对String
的引用也是按值传递的,因此在该方法返回后,为此引用赋值将无效。