2017-04-06 27 views
1

我碰到下面的文字中梁丹尼的關於Java編程的最新著作來到(頁386,第10版。):被攔截的字符串是否有資格在Java 8中進行垃圾收集?

執行以下代碼更改字符串的內容是什麼?

String s = "Java"; 

s = "HTML"; 

答案是否定的。 ... 第一個String對象在賦值後仍然存在,但它不能再被訪問,因爲變量s現在指向新對象,如圖10.15所示。

基於上述文字,似乎作者認爲字符串對象「Java」不是垃圾收集,即使它不再被引用。我知道Java中interned字符串的存儲位置有一些變化。請記住,上面的書是關於Java SE 8的。

但是根據Java垃圾收集器,未使用的對象(不再被引用的對象)會自動被垃圾收集。

那麼Java SE 8的實際情況是哪種情況?

+2

我不認爲作者聲稱字符串不能被GC'ed;該聲明是非正確的,有人可能會看到它對其他(非字符串)類型也是如此。 –

+0

整個_class_在_code_中仍然帶有對該字符串文字的引用。 –

回答

0

作者的觀點與垃圾回收沒有多大關係。在未來的某個時間點對象將被垃圾收集的事實並不違背它在分配後仍然存在的斷言。他並不是說它會永遠存在,只是這個任務不會改變原來的對象。

+0

但是他已經在前面的第7章中介紹了垃圾收集,第9章介紹了一般對象。所以當我在第10章中讀到了字符串的上述上下文時,這聽起來讓我感到困惑。不管那本書的內容如何,​​你能回答我的問題嗎? – Peng

+0

我認爲你是對的,對象將被垃圾收集。我只是不同意你的觀點,即作者的觀點是字符串對象「Java」不是垃圾收集。他在新任務中聲明對象沒有改變的事實並不意味着它在某個時刻不會被垃圾收集。 – rockusbacchus

+0

感謝您的澄清。 – Peng

1

字符串文字是interned字符串,但並非所有interned字符串都是字符串文字。

字符串文字通過定義它們的類保持活動狀態,而這些類又由實例和類加載器保持活動狀態。您需要爲他們上課卸載,纔有資格獲得GC。

實習字符串另一方面只保證,如果string1.equals(string2) then string1.intern() == string2.intern()。這個特殊的定義允許interned字符串被垃圾回收,因爲oldInternedString != newInternedString不可觀察,因爲如果它被垃圾回收了,就不能引用oldInternedString。因此,字符串國際聯盟表可以(但不是必需的)實現爲弱引用的表,這允許它們被GCed。