【问题标题】:java.lang.OutOfMemoryError: Java heap space on stream.mapToInt()/ArrayListsjava.lang.OutOfMemoryError:stream.mapToInt()/ArrayLists 上的 Java 堆空间
【发布时间】:2017-09-29 15:05:12
【问题描述】:
ArrayList<Integer> digitList = new ArrayList<Integer>();
ArrayList<Integer> newBase = new ArrayList<Integer>();

public void toX(int base, int oNum) {
    while(base > 0) {
        digitList.add(base % 10);
        base /= 10;
    }
    int[] digits = digitList.stream().mapToInt(i->i).toArray();
    for(int i = 0; i<digits.length/2; i++) {
        int a = digits[i];
        digits[i] = digits[digits.length -i -1];
        digits[digits.length -i -1] = a;
    }
    System.out.println(Arrays.toString(digits));
    for(int i = 0; i < digits.length; i++) {
        total += digits[i];
    }
    System.out.println(total);
    while(total >= 0) {
        if(total >= oNum) { 
        newBase.add(total - oNum);
        total -= oNum;
        System.out.println(total);
        }
        else {
            newBase.add(total);
        }
    }
    int[] ans = newBase.stream().mapToInt(i->i).toArray();
    System.out.println(Arrays.toString(ans));
}

此方法旨在将基数为 10 的数字转换为 baseX 中的数字。它未完成,我不断收到多个错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.ArrayList.grow(Unknown Source)
    at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
    at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
    at java.util.ArrayList.add(Unknown Source)
    at BaseConverter.toX(BaseConverter.java:34)

第 33-35 行是:

else {
    newBase.add();
}

我认为问题来自流,但我对流和数组列表非常缺乏经验。

【问题讨论】:

  • 我发现oNum=0 存在无限循环问题。此外,您可以使用一些 mapToInt 技巧来反转数字而无需循环:stackoverflow.com/questions/24010109/…
  • 想想如果 total >=0 但小于 oNum 会发生什么;)

标签: java arraylist out-of-memory java-stream toarray


【解决方案1】:
while(total >= 0) {
    if(total >= oNum) { 
        newBase.add(total - oNum);
        total -= oNum;
        System.out.println(total);
    }
    else {
        newBase.add(total);
    }
}

如果您点击else 分支,它将继续向newBase 添加项目而不更改total,从而导致无限循环。

【讨论】:

  • 这在大多数情况下是不正确的,因为如果满足total &gt;= oNum 条件,总数会减去oNum
  • @CrazySabbath 不能保证在所有情况下都会给出错误,但那又怎样?这显然是正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2012-04-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
相关资源
最近更新 更多