java - 按值传递(StringBuilder 与 String)

标签 java string parameter-passing stringbuilder pass-by-value

<分区>

我不明白为什么 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
}

最佳答案

因为当你调用 speak(name); 时,你在里面说话

name = name.concat("4");

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

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

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

尝试

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

当然,现在我认为没有必要解释为什么它与 StringBuilder 一起工作,除非您不知道 StringBuilder 是可变的。

关于java - 按值传递(StringBuilder 与 String),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31382825/

相关文章:

Java:使用 Swing 的安全动画

Java循环链表

java - Gradle中的错误

c# - 在 C# 中将索引器作为参数传递

python - 向此类 python 函数传递更多参数

java - 如何从方法返回数组?

java - 无法解析复杂类型的属性

java - 如何使用java中的字符串分割删除字符串前面的空格?

python - 计算行数并根据字符串 [with str.contains] 在 python 中的位置创建标签列

javascript - 拆分 JavaScript 变量的字符串内容并分配给单独的 JS 变量