2013-07-24 23 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