【问题标题】:Confusion about String substring method [duplicate]关于字符串子字符串方法的困惑[重复]
【发布时间】:2013-07-24 19:17:44
【问题描述】:

我有一个问题。我正在阅读有关子字符串的博客。在下面引用它。

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

我不明白说一个小引用可以防止垃圾收集是什么意思。有人可以解释这个概念吗?谢谢

【问题讨论】:

标签: java


【解决方案1】:

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

正如 cmets 中所指出的,这种情况在 Java 的最新版本(1.7.0_06 和更高版本)中不会出现。请参阅此link 以获得解释,但简而言之:现在substring() 每次都会创建一个新字符串,因此底层char[] 不再共享。

【讨论】:

  • 在 Oracle Java 7 中,这不再适用。
  • 哦,我现在明白这个概念了。我对术语感到非常困惑。我现在明白了。
  • @SotiriosDelimanolis 能否提供一个链接说明这一点?
  • 这个link解释了,你可以看看String源代码。
  • @SotiriosDelimanolis 好电话!谢谢:)
【解决方案2】:

我相信这个链接回答了你的问题:

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 的引用放入 新的字符串。它实际上所做的是保存对 原始字符串的后备数组;即持有的数组 字符。

... 原始字符串的整个后备数组将保持可达 ...这意味着它不会成为垃圾收集的候选者。

但还有一个复杂的问题。您将 sample1 设置为 String 字面量,表示字符串字面量的 String 对象是 始终可达(除非整个类都被卸载!)

在您的第二个示例中,复制子字符串会导致一个新字符串 被创建。并且保证新的字符串不会共享 带有原始字符串和临时子字符串的后备数组

还有:

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

Java 7 String - substring complexity

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 2013-08-12
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多