传值(StringBuilder vs String)

Hel*_*esh 12 java string stringbuilder parameter-passing pass-by-value

我不明白为什么System.out.println(name)输出Sam而不受方法的concat函数的影响,而System.out.println(names)输出Sam4作为方法的append方法的结果.为什么StringBuilder受影响而不是String?通常,在对对象的引用上调用方法会影响调用者,所以我不明白为什么String结果保持不变.提前致谢

public static String speak(String name) {
    name = name.concat("4");
    return name;
}

public static StringBuilder test(StringBuilder names) {
    names = names.append("4");
    return names; 
}

public static void main(String[] args) {
    String name = "Sam";
    speak(name);
    System.out.println(name); //Sam
    StringBuilder names = new StringBuilder("Sam");
    test(names);
    System.out.println(names); //Sam4
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*hik 13

因为当你打电话时speak(name);,在你说话的时候会说话

name = name.concat("4");
Run Code Online (Sandbox Code Playgroud)

它创建一个新对象,因为Strings是不可变的.当您更改原始字符串时,它会创建一个新对象,我同意您将其返回,但您没有抓住它.

所以你所做的基本上是:

name(new) = name(original) + '4'; // but you should notice that both the names are different objects.
Run Code Online (Sandbox Code Playgroud)

尝试

String name = "Sam";
name = speak(name);
Run Code Online (Sandbox Code Playgroud)

当然,现在我认为没有必要解释为什么它正在使用,StringBuilder除非你不知道它StringBuilder是可变的.


Tur*_*g85 9

看看JavadocString,您会发现

[...] String对象是不可变的 [...].

这意味着concat(String)不会改变String自身,而是构建一个新的String.

StringBuilder另一方面,s是可变的.通过调用append(CharSequence),对象本身是变异的.