2013-07-24 24 views
2

我有一個問題。我正在閱讀有關子字符串的博客。請在下面引用它。關於字符串子串方法的困惑

這裏值得一提的一點是子字符串也是 由原始字符串使用的字符數組備份。如果原始字符串對象非常大,並且子字符串 非常小,則此 可能很危險,因爲即使 沒有其他引用用於該特定字符串,即使一小部分也可以保存 完整數組的引用並且防止其被垃圾收集

我不能理解小的參考可以阻止垃圾收集是什麼意思。有人可以解釋這個概念嗎?謝謝

+0

我相信這應該回答你的問題:?另一個字符串的一個子將防止垃圾回收父字符串(HTTP://計算器。com/questions/15857883/will-a-substring-of-another-string-prevent-the-parent-string-from-being-garbage) – paulsm4

+2

僅供參考,在Oracle Java 7中, ]'不再共享。 –

+0

你可以參考這個答案http://stackoverflow.com/questions/2514349/lost-string-garbage-collection。 –

回答

3

這意味着作爲substring()操作結果創建的所有新字符串都會保留對原始字符串中字符數組的引用,並且原始字符數組不會被垃圾收集,直到從中派生出的所有子字符串都是也收集垃圾,不管它們是大還是小。

正如在評論中指出的那樣,這種情況在最近版本的Java(1.7.0_06和更新版本)中不會出現。請參閱此link以獲取解釋,但簡而言之:現在substring()每次都會創建一個新字符串,因此底層char[]不會再被共享。

+1

在Oracle Java 7中,這不再是事實。 –

+0

哦,我現在明白了這個概念。我對這個術語很困惑。我現在知道了。 – benz

+0

@SotiriosDelimanolis你能提供一個鏈接說明這一點嗎? –

1

我相信這個鏈接回答您的問題:

Will a substring of another string prevent the parent string from being garbage collected?

// Example 1 
String samplel = "ToBeGarbageCollected"; 
String sample2 = samplel.substring(0, 1); 

// Example 2 
String samplel = "ToBeGarbageCollected"; 
String sample2 = new String(samplel.substring(0, 1)); 

的子方法不放在 新的字符串到原來的字符串的引用。它實際上做的是保存對原始字符串的後備數組的引用 ;即保存 字符的陣列。

...原始String的整個支持數組將保持可到達 ...這意味着它不會成爲垃圾收集的候選者。

但還有另一個複雜因素。您可以設置SAMPLE1爲String 文字,並表示一個字符串文字String對象是 總是到達(除非整個班級被卸載!)

在你的第二個例子,複製子產生一個新的字符串 是創建。它保證了新的字符串將不與原來的字符串和臨時串

也有着 支持數組:

由於索蒂里奧斯Delimanolis正確說:這不再是Java 7中的真實或更高:

Java 7 String - substring complexity