2011-07-19 27 views
1

我知道Java字符串是不可变的。但是,当我运行下面的函数时,输出结果并不是我期望的结果。String不变性问题

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,我希望它是。是否因为我传递一个数组引用作为修改函数的第二个参数,而不是传递String对象本身?任何澄清高度赞赏。

回答

10

你已经改变了数组的内容 - 数组总是可变的。

该数组最初包含对字符串“witch”的引用。您的modify方法将数组更改为包含对字符串“sod”的引用。没有任何字符串本身被改变 - 只是数组的内容。

(注意,ss[0]值不是一个字符串 - 这是一个参考为一个字符串。)

+0

谢谢乔恩!这使我对我的下一个qn-不是对象也是对字符串的引用?那么s与ss [0]有什么不同呢? – OckhamsRazor

+1

@OckhamsRazor:将值赋给's'只会改变参数的值。赋值给'ss [0]'会改变'ss'引用的数组的值。 –

+0

啊我明白了 - 这意味着阵列本身并不包含字符串;相反,数组的内容存储对字符串的引用? – OckhamsRazor

1

是不是因为我传递一个数组引用作为第二个参数 的修改函数而不是传递String对象本身?

没错。您正在传递对可变对象(数组)的引用。当方法更改此对象时,更改将在方法外部可见。

0

字符串是,你不能改变的“Hello World”为“Hello”不可改变的手段非常好的文章。但是你可以分配一个完整的新字符串。这就是你在这里做的。

您正在引用一个数组对象。这就是数组内容被改变的原因。