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是可变的.
看看JavadocString,您会发现
[...] String对象是不可变的 [...].
这意味着concat(String)不会改变String自身,而是构建一个新的String.
StringBuilder另一方面,s是可变的.通过调用append(CharSequence),对象本身是变异的.
| 归档时间: |
|
| 查看次数: |
4490 次 |
| 最近记录: |