我知道Java字符串是不可变的。但是,当我运行下面的函数时,输出不是我期望的那样。
public static void main(String[] args) {
String s = "wicked";
String [] ss = new String [1];
ss[0] = "witch";
modify(s, ss);
System.out.println(s+" "+ ss[0]);
}
private static void modify(String s, String[] ss) {
s = "sad";
ss[0] = "sod";
}
我得到的输出是wicked sod
,而不是我预期的wicked witch
。是因为我传递一个数组引用作为modify函数的第二个参数而不是传递String对象本身?任何澄清都非常感谢。
答案 0 :(得分:10)
你已经改变了数组的内容 - 数组总是可变的。
该数组最初包含对字符串“witch”的引用。您的modify
方法更改数组以包含对字符串“sod”的引用。没有任何字符串本身已被更改 - 只是数组的内容。
(请注意,ss[0]
的值不是字符串 - 它是字符串的引用。)
答案 1 :(得分:1)
是因为我传递数组引用作为第二个参数 修改函数而不是传递String对象本身?
完全。您正在传递对可变对象(数组)的引用。当方法更改此对象时,更改将在方法外部可见。
答案 2 :(得分:0)
阅读一篇关于Yoda Parameter passing in Java - by reference or by value?
传递方法参数的非常好的文章答案 3 :(得分:0)
字符串不可变意味着您无法将“hello world”更改为“hello”。但是您可以分配一个完整的新字符串。这就是你在这里所做的。
您正在引用数组对象。这就是数组内容发生变化的原因。