2014-06-29 58 views
-6

考慮兩個scenarios-如果我可以改變它的值,String是不可變的嗎?我明白,我只是改變參考,但爲什麼第一種情況不起作用?

場景1:

class S{ 
    String s="hello"; 
    s="world"; 
    System.out.println(s); 
} 
public class StringImmutable{ 
    public static void main(String args[]){ 

    } 

結果 - 它拋出在pkg.StringImmutable.main(StringImmutable.java:12)未編譯的代碼錯誤

但是當我做到這一點 -

class S{ 
    String s="hello"; 

    void change(){ 
     s="world"; 
     System.out.println(s); 
    } 
} 
public class StringImmutable{ 
    public static void main(String args[]){ 
     S s=new S(); 
     s.change(); 
    } 
} 

Result- world..it工作得很好。

如何爲String不可改變此處輸入代碼

+0

您需要區分變量與對象。 –

+1

如果一個字符串是不可變的,那麼's1 =「hello」; S2 = S1; s2.change();'也會改變s1。你正在做的是將s改成**指向**另一個字符串 –

+0

當你做's =「world」時,'s'開始指向一個新的String對象(「world」)。 '「hello」'留在內存中,稍後會被GCed。 – Abhi

回答

4

您正在創建新的字符串 - 不涉及任何突變。每當你想編輯一個字符串(即s1 = s1 + s2,s1 += s2,s1 = s1.substring( ...)它創建一個新的字符串,而不是一個突變。

字符串不可設計。

+0

(並非總是如此。賦值(「=」)不會創建一個新的字符串,它是對* *可以創建新的字符串RHS上的東西。) –

+0

起首...編輯我的答案。 –

相關問題