2013-09-05 57 views
-6

我不明白這段代碼,爲什麼我的字符串cmain方法中沒有更改,但是在changeString中更改。你能解釋我嗎?Java String是不可變的嗎?

class MainClass { 
    public static void main(String[] args) { 
     String c = "lalala"; 
     changeString(c); 
     System.out.println("str in main = "+c); 
    } 

    public static void changeString(String str) { 
     str = str + "CHANGE!!!"; 
     System.out.println("str in changeString = "+str); 
    } 

} 

結果:

str in changeString = lalalaCHANGE!!! 
str in main = lalala 
+6

在Java中可能有一千個重複的問題。請查看本頁面右側相關部分的鏈接 –

+0

此鏈接將向您解釋Java中字符串的概念[查看本文] [1] [1]:http://javarevisited.blogspot.in/2010 /10/why-string-is-immutable-in-java.html – yantrakaar

+0

我正在寫一個答案。如果你想了解變量是如何工作的,你應該閱讀http://python.net/~mwh/hacks/objectthink.html。儘管這篇文章是用Python編寫的,但在使用對值的引用的語言中這個概念是相同的。 * TL; DR - 變量名稱綁定到不包含對象的桶中* –

回答

4

是的,java字符串是不可變的。

changeString,你傳遞一個參考串lalala,然後要更改爲一個指向lalalaCHANGE!!!參考。原始字符串對象不會更改,並且main中的引用仍指該原始對象。

如果你要使用StringBuilder而不是字符串,並追加CHANGE!!!到StringBuilder的,那麼你會看到的變化反映在主要查看它:

class MainClass { 
    public static void main(String[] args) { 
     StringBuilder c = new StringBuilder("lalala"); 
     changeString(c); 
     System.out.println("str in main = "+c.toString()); 
    } 

    public static void changeString(StringBuilder str) { 
     str.append("CHANGE!!!"); 
     System.out.println("str in changeString = "+str.toString); 
    } 

} 

在這個變化的版本,你會得到:

str in changeString = lalalaCHANGE!!! 
str in main = lalalaCHANGE!!! 
+0

這個鏈接將解釋你在Java中的字符串的概念[檢查這個] [1] [1]:http://javarevisited.blogspot.in/2010/10/why-string-is-immutable-in-java .html – yantrakaar

+0

@yantrakaar你爲什麼對我評論?也許直接評論OP? – hexafraction

+0

我的錯誤對不起 – yantrakaar

2

是Java的String不可改變?

字符串是不可變的,這意味着你不能改變對象本身,但你可以改變引用的課程。

所以,當你這樣做你changeString方法:

str = str + "CHANGE!!!"; 

一個新的字符串的內存對象被創建。但main方法中的c參考仍指向舊的存儲器內存對象,因此會打印lalala

1

字符串是不可改變的,當然是:

注意:String類是不可變的,所以一旦創建了一個 字符串對象就不能改變。該字符串類有一些 方法,其中一些將在下面討論,似乎修改 字符串。由於字符串是不可變的,因此這些方法實際上做的是 創建並返回一個包含 操作結果的新字符串。

http://docs.oracle.com/javase/tutorial/java/data/strings.html

str = str + "CHANGE!!!"; 

此代碼返回不同的字符串和更換其引用到你的變量,但原字符串沒有改變。

相關問題