关于String substring方法的困惑

时间:2013-07-24 19:17:44

标签: java

我有一个问题。我正在关于substring的博客上阅读。请在下面注明。

  

这里值得记住的一点是子串也是   由字符数组备份,由原始字符串使用。这个   如果原始字符串对象非常大且子串,则可能很危险   非常小,因为即使是一小部分也可以参考   完整的数组并防止它被垃圾收集,即使   该特定字符串没有其他参考

我无法理解一个小参考可以防止垃圾收集是什么意思。有人可以解释这个概念吗?感谢

2 个答案:

答案 0 :(得分:3)

这意味着由substring()操作创建的所有新字符串都保存对原始字符串中字符数组的引用,并且原始字符数组将不会被垃圾收集,直到所有子字符串派生自它也是垃圾收集的,无论它们是大还是小。

正如评论中指出的那样,在Java的最新版本(1.7.0_06及更新版本)中不会出现这种情况。有关说明,请参阅此link,但简而言之:现在substring()每次都会创建一个新字符串,因此基础char[]不会再被共享。

答案 1 :(得分: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));
  

substring方法不会引用原始String   新的String。它实际上做的是保存对的引用   原始String的后备阵列;即持有的数组   字符。

     

...原始String的整个后备阵列将保持可访问状态   ......这意味着它不会成为垃圾收集的候选者。

     

但还有另一个复杂因素。您将sample1设置为String   literal,以及表示String文字的String对象   总是可以访问的(除非整个类被卸载!)

     

在第二个示例中,复制子字符串会导致新的String   被创造。并且保证新的String不会共享   使用原始String和临时子字符串

支持数组

ALSO:

正如Sotirios Delimanolis所说:Java 7或更高版本不再适用:

Java 7 String - substring complexity