我們都知道,很多Java書中說String對象的內容不能修改,但在實際情況中賦值符號還是可以用在已創建的String類對象中,如下面的代碼所示:
String s1 = "abs";
String s2 = "abs";
System.out.println("before change:");
System.out.println("s1 is "+s1);
System.out.println("s2 is "+s2);
System.out.println("s1 == s2 is " + (s1 == s2));
s1 = s1.replace('a','c');
System.out.println("after change:");
System.out.println("s1 is "+s1);
System.out.println("s2 is "+s2);
System.out.println("s1 == s2 is " + (s1 == s2));
程序運行的結果如下圖:
由結果可以看出:
s1能夠用賦值符號修改,此時並不會報錯。一開始,s1與s2指向同一個地址。當s1修改後,s2的內容並不會改變,s1與s2將不再指向同一個地址。此時,s1應該是重新新建了一個對象。
這裡要指出的是語句s1.replace('a','c'); 返回的是一個新的字符串並且不會更改原先字符串的內容。如果沒有單純運行s1.replace('a','c'),s1的內容並不會更改。
如果將一個已創建的String類對象用賦值符號與另一個String類對象連接時,產生的效果會不一樣,代碼如下所示:
String s1 = "abs";
String s2 = "abs";
String s3 = new String ("abs");
System.out.println("before change:");
System.out.println("s1 is "+s1);
System.out.println("s2 is "+s2);
System.out.println("s3 is "+s3);
System.out.println("s1 == s2 is " + (s1 == s2));
System.out.println("s2 == s3 is " + (s2 == s3));
s3 = s1;
System.out.println("after change:");
System.out.println("s1 is "+s1);
System.out.println("s2 is "+s2);
System.out.println("s3 is "+s3);
System.out.println("s1 == s2 is " + (s1 == s2));
System.out.println("s2 == s3 is " + (s2 == s3));
代碼運行的結果如下圖:
可以看到,原先s1和s3並不指向同一位置,但當執行s3 = s1後,s3指向s1的地址,此時s2,s3指向同一地址。按照Java的回收機制,此時原來s3所指向的地址的對象應該被回收。