2011-09-21 59 views
2

有人告訴我,在java中的字符串不能改變。下面的代碼是什麼?字符串不變性

name="name"; 
name=name.replace('a', 'i'); 

沒有它改變name字符串? 另外,replace()的實現在哪裏?相比於();等於();提供? 我只是在這裏使用這些函數,但實際上他們在哪裏實現?

+1

請注意,1)變量*不是對象*和; 2)'String.replace'方法返回*新的String對象* - 原始對象不變。 – 2011-09-21 04:41:31

回答

6

String.replace()返回一個新的String。

「name」是對String對象的引用,所以它可以被重新指定爲指向name.replace(),但它將指向一個新的對象。

這裏是javadoc for String,在這裏你可以找到所有的方法。

+0

該名稱引用的原始對象會發生什麼情況? – Kraken

+0

如果「name」是該對象的唯一引用,那麼該對象將消失並且將被垃圾收集。如果別的東西持有對該對象的引用,那麼它將繼續存在。 –

+0

不,它不會立即GC'd,但可能存儲在字符串池中一段時間​​,以備再次使用。 –

1

這是一個將引用變量(名稱)與引用的String對象(「name」)混淆的經典案例。他們是兩個截然不同的野獸。字符串不會改變(忽略反射類型的kludges),但引用變量可以根據需要引用許多不同的字符串。你會注意到,如果你只是叫

name.replace('a', 'i'); 

什麼也沒有發生。如果將名稱變量分配給不同的字符串,則只能看到更改,該字符串是由replace方法返回的字符串。

0

試試這個,看看它爲你的自我:

String name = "name"; 
String r = name.replace('a', 'i'); 
System.out.println(name);// not changed 
System.out.println(r ); // new, different string 

如果您分配了新的裁判R,原來的對象不會改變。

我希望這會有所幫助。

+0

這實際上並不表現出不變性。 –

0

如果你的代碼是 name="name"; name.replace('a', 'i'); //assignment to String variable name is neglected System.out.print(name)

輸出: name

這是因爲name.replace('a','i')將投入替換字符串,nime在串池,而是引用不指向字符串變量名。

每當ü嘗試修改字符串對象, java的檢查,是結果字符串在字符串池中 可如果有可用的字符串的引用指向可變 其他新的字符串對象被創建的字符串字符串池和創建的對象的引用被指向字符串變量。