我有一个奇怪的问题。我正在解析具有大文本字段的文档。在我的角色部分中,我正在使用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是此对象的成员变量,以“”初始化;注意-分配给本地String变量而不是char []-也会失败。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
我认为这可能与方法的性能优化有关StringBuffer toString()。
Sun Javadoc表示以下内容:
可以对该方法进行编码,以便创建新的String对象,而无需分配新的内存来保存字符序列的副本。而是,字符串可以共享字符串缓冲区使用的内存。然后,任何随后更改字符串缓冲区的内容或容量的操作都必须在那时复制内部缓冲区。当使用字符串缓冲区实现该策略时,该策略可有效减少由字符串串联操作分配的内存量。
因为您要重新使用StringBufferwith,setLength(0)所以它可能会保留对其创建的所有String的引用toString()。
更换:
currentStory.setLength(0); 与:
currentStory = new StringBuffer(); 看看是否能解决。我认为这不会增加任何开销,因为在两种情况下都需要创建一个新char[]数组,因为在第一种情况下,String创建的with 将使用该数组toString()。
另外,您应该考虑使用,StringBuilder因为它们比首选StringBuffer。