2014-03-27 71 views
1

我對String和String Builder感到困惑。這是我簡單的代碼java String和StringBuilder

StringBuilder sb1 = new StringBuilder("123"); 
String s1 = "123"; 
sb1.append("abc"); 
s1.concat("abc"); 
System.out.println(sb1 + " " + s1); 

SB1輸出123ABC。沒關係!因爲它使用附加方法。但字符串s1應該是abc123 ,但它的輸出是abc。爲什麼? concat方法的目的是什麼?請解釋我。

謝謝

+1

字符串是不可變的...嘗試閱讀字符串不可變的概念 – Siva

+0

您的s1輸出是123,但錯誤地,你寫爲abc。它讓我困惑:) – Skabdus

回答

15

。但字符串S1應該ABC123,但它輸出爲abc。

字符串在Java中是不可變的。 concat不會更改現有的字符串 - 它會返回一個新的字符串。所以,如果你使用:

String result = s1.concat("abc"); 

然後將 「123ABC」 - 但s1仍將是 「123」。 (或者說,的s1值仍然會與內容「123」字符串的參考。)

同樣如此對String任何其他方法,你威力指望改變的內容,例如replacetoLowerCase。當你在字符串上調用方法但不使用結果時(這裏就是這種情況),這幾乎總是一個錯誤。

字符串不可變的事實是StringBuilder首先存在的全部原因。

+1

非常感謝。現在我明白了。字符串是不可變的。 StringBuilder是可變的。 – T8Z

3

concat函數不會改變字符串,但它返回它不是在你的情況下,分配結果:

String concat(String textToAppend) 

所以更改:

s1 = s1.concat("abc"); 
3

字符串對象是不可改變的。不可變只是意味着不可修改或不可改變的

,但如果你給

String result = s1.concat("abc"); 

輸出123ABC 和 StringBuilder是可變 可以執行修改

1

s1.concat( 「ABC」)將創建一個堆中的新對象與「abc」串聯到s1。但s1仍然指向原來的s1,即「123」。所以你需要讓你的s1引用指向使用s1 = s1.concat(「abc」)的新對象;

相關問題