我有一个问题。我正在关于substring的博客上阅读。请在下面注明。
这里值得记住的一点是子串也是 由字符数组备份,由原始字符串使用。这个 如果原始字符串对象非常大且子串,则可能很危险 非常小,因为即使是一小部分也可以参考 完整的数组并防止它被垃圾收集,即使 该特定字符串没有其他参考
我无法理解一个小参考可以防止垃圾收集是什么意思。有人可以解释这个概念吗?感谢
答案 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或更高版本不再适用: