字符串不变性问题

时间:2011-07-19 10:44:12

标签: java string immutability

我知道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对象本身?任何澄清都非常感谢。

4 个答案:

答案 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”。但是您可以分配一个完整的新字符串。这就是你在这里所做的。

您正在引用数组对象。这就是数组内容发生变化的原因。