簡體   English   中英

字符串不變性

[英]Strings Immutability

有人告訴我不能更改Java中的字符串。下面的代碼呢?

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

它不更改name字符串嗎? 另外,replace()的實現在哪里; 相比於(); 等於(); 提供? 我只是在這里使用這些功能,但實際上在哪里實現?

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

“名稱”是對String對象的引用,因此可以將其重新分配為指向name.replace(),但它將指向一個新對象。

這是Stringjavadoc ,您可以在其中找到所有方法的作用。

這是將引用變量(名稱)與它所引用的String對象(“名稱”)混淆的經典案例。 它們是兩種截然不同的野獸。 字符串從不改變(忽略反射類型的亂碼),但是引用變量可以根據需要引用盡可能多的不同字符串。 您會注意到,如果您剛剛打電話

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

什么都沒發生。 僅當您將名稱變量分配給另一個String(由replace方法返回)時,您才能看到更改。

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

輸出: name

這是因為name.replace('a','i')會將替換后的字符串nime放在字符串池中,但引用未指向String變量名。

每當您嘗試修改字符串對象時, java檢查,結果字符串是否在字符串池中可用 如果可用,則將可用字符串的引用指向字符串變量 否則,將在字符串池中創建新的字符串對象,並將創建對象的引用指向字符串變量。

嘗試一下,自己看看吧:

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

如果將新的引用分配給r,則原始對象不會更改。

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM