有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用single StringBuilder的java抛出OutOfMemoryException

像下面的代码一样,读取每一行并基于输入列表listValues执行串联

BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
InputStream in = new FileInputStream(new File(file));
br = new BufferedReader(new InputStreamReader(in), 102400);
for (String input; (input= br.readLine()) != null;) {
    for (int i = 0; i < listValues.size(); i++) {
        sb.append(input.substring(1, 5));
    }
    map.put(sb.toString(), someOtherValue);
    sb.delete(0, sb.length());
}

通过设置每次删除内容,为每次迭代使用相同的StringBuilder。还扔

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.String.substring(Unknown Source)

我犯了什么错误

编辑:我已按照芭丝谢芭的建议更正。 但是现在

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)

for (String input; (input= br.readLine()) != null;) 现在有什么问题


共 (1) 个答案

  1. # 1 楼答案

    在紧循环中使用substring是不明智的,因为它将创建许多字符串,这些字符串可能在以后才会被垃圾收集

    您的解决方案是使用charAt并将char附加到StringBuilder实例:

    for (int j = 1; j <= 5; ++j){ /*ToDo - check the loop bounds*/
        sb.append(input.charAt(j)); /*StringBuilder has an overload for `char` insertion*/
    }