传递值(StringBuilder vs String)

我不明白为什么System.out.println(name)输出Sam而不受方法的concat函数的影响,而System.out.println(names)由于该方法的追加方法而输出Sam4。为什么 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
}

答案 1

因为当你打电话的时候,里面说话的时候你做speak(name);

name = name.concat("4");

它创建一个新对象,因为 s 是不可变的。当您更改原始字符串时,它会创建一个新对象,我同意您正在返回它,但您没有捕获它。String

所以基本上你正在做的是:

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

尝试

String name = "Sam";
name = speak(name);

当然,现在我认为没有必要解释为什么它正在工作,除非你不知道它是可变的。StringBuilderStringBuilder


答案 2

看看Javadoc for String,人们会读到

[...]字符串对象是不可变的 [...]。

这意味着concat(String)不会更改本身,而是构造一个新的.StringString

另一方面,StringBuilders是可变的。通过调用 append(CharSequence),对象本身就会发生突变。