4

我有一个奇怪的问题。我正在解析一个带有大文本字段的文档。在我的字符部分,我正在使用 StringBuilder

currentStory.append(ch, start, length);

然后在我的 endElement 中,我将它分配给我的对象上的适当字段。

  if (name.equals(tagDesc)) {
     inDesc = false;
     if (currentItem != null ) {
         currentItem.setSummaryText(currentStory.toString());
     }
     currentStory.setLength(0);
  }

setSummaryText(String text)方法是:

    public void setSummaryText(String text) {
      Story = text;
    }

而且我的内存快用完了。

如果我将 setSummaryText 更改为像这样完全奇怪的东西

public void setSummaryText(String text) {
      char[] local = text.toString()
      Story = new String(local);
   }

我很好。我只是不知道我在哪里拿着那个参考?Story 是这个对象的成员变量,用“”初始化;注意 - 分配给本地字符串变量而不是 char[] - 也会失败。

4

1 回答 1

5

我认为这可能与该StringBuffer toString()方法的性能优化有关。

Sun javadoc 说明如下:

可以对这个方法进行编码,以便创建一个新的 String 对象,而无需分配新的内存来保存字符序列的副本。相反,字符串可以共享字符串缓冲区使用的内存。任何改变字符串缓冲区内容或容量的后续操作都必须在那时制作内部缓冲区的副本。当使用字符串缓冲区实现时,此策略对于减少字符串连接操作分配的内存量是有效的。

因为您正在重新使用StringBufferwith ,setLength(0)所以它可能会保留对它创建的所有字符串的引用toString()

代替:

currentStory.setLength(0);

和:

currentStory = new StringBuffer();

看看是否能解决它。我认为这不会产生更多开销,因为在这两种情况下,您都需要创建一个新char[]数组,因为在第一种情况下,数组被String创建的 with 使用toString()

此外,您应该考虑使用 a StringBuilder,因为它们更喜欢StringBuffer.

于 2010-01-06T21:15:37.750 回答