【发布时间】:2012-07-08 19:18:20
【问题描述】:
我有这段代码可以将 StringBuilders 的 ArrayList 转换为 Strings 的 ArrayList:
代码:
public ArrayList<String> convGenSeqToString(ArrayList<StringBuilder> buff){
ArrayList<String> convBuf = new ArrayList<String>();
for (StringBuilder xVar: buff){
convBuf.add(xVar.toString());
}
return convBuf;
}
我的代码适用于 15-20MB 文本文件的文件。但是我有一个 44MB 的文本文件,每当我使用该文本文件运行程序时,我总是会收到此错误。
错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2746)
at java.util.ArrayList.ensureCapacity(ArrayList.java:187)
at java.util.ArrayList.add(ArrayList.java:378)
at Recognition.convGenSeqToString(Recognition.java:157)
at Recognition.genSeq(Recognition.java:145)
at Recognition.Recognitions(Recognition.java:96)
at ChainDetection.main(Detection.java:25)
我已经使用 -Xmx2048M 增加了 JVM 运行配置中的内存,但我仍然有同样的错误。我在上面显示的代码中指出了错误,并突出显示了这一行:
convBuf.add(xVar.toString());
有没有其他方法可以在不使用.toString() 方法的情况下将StringBuilder 转换为字符串?我在其他论坛和这里也看到他们为 toString 创建了自定义类,但还不熟悉泛型和一些“@”关键字。有人对如何解决这个问题有建议或指导吗?
已编辑
我按照 vanza 的建议编辑了我的代码 在这里:
public ArrayList<String> convGenSeqToString(ArrayList<StringBuilder> buff){
ArrayList<String> convBuf = new ArrayList<String>(buff.size());
Iterator <StringBuilder> iterBuf = buff.iterator();
while (iterBuf.hasNext()){
StringBuilder x = iterBuf.next();
convBuf.add(x.toString());
iterBuf.remove();
}
return convBuf;
}
错误信息:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.ArrayList.<init>(ArrayList.java:132)
at Recognition.convGenSeqToString(Recognition.java:154)
at Recognition.genSeq(Recognition.java:145)
at Recognition.Recognitions(Recognition.java:96)
at ChainDetection.main(ChainDetection.java:25)
我用 buff.size() 和没有 buff.size() 试过这个,我得到了同样的错误信息。但似乎我的错误信息现在减少到 5。对此还有其他想法吗?提前致谢!
【问题讨论】:
-
为什么不用
CharSequence类型呢?toString()没有必要。 -
你可以用正确的大小声明你的数组列表以避免数组复制。
-
我有点好奇为什么你有一个
StringBuilders 的数组。是否有某些原因需要将元素保留为 StringBuilders?换句话说,无论函数创建这个 StringBuilders 数组,为什么不直接使用 StringBuilder 的 toString 方法创建一个 Strings 数组? -
实际上我的原始代码只是字符串,但是当我运行这个文本文件时,我遇到了所有这些错误。我尝试在网上搜索解决方案,发现与普通字符串连接相比,stringbuilder 在处理字符串连接方面要好得多。所以我把我的代码改成了stringbuilder,但是问题依然存在,和string有关。
标签: java string memory stringbuilder