2012-05-31 76 views
1
String s = "java"; 
s.substring(1); // ava 

考慮串的不變性,編譯器亙古不變的修改's'而是創建一個新的對象,也可以說是有在內存'java' as well as 'ava'空間..在Java中不可變的字符串?

發生這種'ava'什麼,如無指向它或者它不被任何引用..

一個問題...如果我會寫String s = new String("java"); //'Java的不是字符串常量池....

的「AVA」將在字符串文字中哦,那麼還是不?

+0

的[發生了什麼Java中的對象,如果你不引用它,就像這裏:myString.concat(「說」)]可能重複(http://stackoverflow.com/questions/7281160/what如果你不做引用它就像在這裏mystri) –

回答

2

恰好這個「AVA」是什麼,如無指向它,或者它不被任何引用..

新建成的String對象立即成爲符合垃圾收集。

關於你的第二個問題,我不認爲有以下兩個表達式之間的任何差異儘可能的字符串常量池而言:

String s = "java"; 
String s = new String("java"); 

在這兩種情況下,字面"java"會在游泳池裏。 (但是在第二種情況下,s不會指"java"字符串是在游泳池,但不同的String也有字符"java"。)

+1

文字池中的_only_字符串是在類文件中用雙引號(例如「java」)本身特定提及的那些字符串,或者是調用了intern()的字符串。 –

+0

@LouisWasserman:感謝您的編輯。 – NPE

+0

String a =「aaa」;字符串b =新字符串(「aaa」); ---->這將創建一個字符串文字「aaa」的新實例作爲一個單獨的對象,並把它放在池中以及與另一個「aaa」 – Nil

0

s.substring(1)創建一個新的String,指向s的基礎字符數組。這裏要實現的重要事情是char數組在這兩個對象之間共享。如果您使用String(String)構造函數a 新的字符數組創建包含引用的字符。

如果扔掉參考s,如果你有到substring()操作的結果的參考,那麼你必須在底層字符數組的引用。

在你的例子中,你不存儲對新創建的字符串的引用。所以這將很快被垃圾收集。但是,底層陣列仍由s引用。

+0

...但是這必須是一個實現細節,因爲字符串的不變性。 – Vlad

1

1)會發生什麼這個「AVA」,因爲沒有什麼是指向它或它沒有被任何東西引用..

因爲你沒有分配'ava'任何對象意味着'ava'沒有被任何對象指向,所以它將有資格進行垃圾回收。

2)'ava'會在字符串文字池中嗎?

No it would be in string literal pool. 
+0

String a =「aaa」;字符串b =新字符串(「aaa」); ---->這將創建一個字符串文字「aaa」的新實例作爲一個單獨的對象,並將其放入池中以及另一個「aaa」 – Nil