小编典典

为什么将“”附加到字符串可以节省内存?

all

我使用了一个包含大量数据的变量,比如String data. 我想通过以下方式使用这个字符串的一小部分:

this.smallpart = data.substring(12,18);

经过几个小时的调试(使用内存可视化工具),我发现 objects 字段smallpart记住了来自 的所有数据data,尽管它只包含子字符串。

当我将代码更改为:

this.smallpart = data.substring(12,18)+"";

..问题解决了!现在我的应用程序现在使用的内存很少!

这怎么可能?谁能解释一下?我认为 this.smallpart 一直在引用数据,但为什么呢?

更新: 那我该如何清除大字符串?data = new String(data.substring(0,100)) 会做这件事吗?


阅读 69

收藏
2022-07-16

共1个答案

小编典典

执行以下操作:

data.substring(x, y) + ""

创建一个新的(较小的)String 对象,并丢弃对由 substring() 创建的 String 的引用,从而启用对此的垃圾收集。

要意识到的重要一点是,它为 现有substring()字符串提供了一个窗口-
或者更确切地说,是原始字符串下面的字符数组。因此它将消耗与原始字符串相同的内存。这在某些情况下可能是有利的,但如果您想获取子字符串并处理原始字符串(如您所见),则会出现问题。
__

查看JDK String 源代码中的substring() 方法以获取更多信息。

编辑:要回答您的补充问题,从子字符串构造一个新字符串将减少您的内存消耗, 前提是 您将任何对原始字符串的引用合并。

注意(2013 年 1 月)。上述行为在 Java 7u6中发生了变化。享元模式不再使用,substring()将按照您的预期工作。

2022-07-16