我正在对 Java 进行一些修改,但在其他一些语言方面有很多经验。 我有一个测试问题,我知道解决方案(并且可以轻松地用 Python 和 C++ 生成)。但运行以下 Java 代码会给出
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我想知道我是否犯了一个简单的错误,我根本不希望这个程序的内存占用量很大:
public static void main(String[] args) {
ArrayList<Integer> longest_sequence = new ArrayList<>();
ArrayList<Integer> this_sequence;
int n = 0;
for (int i = 1; i < 1000000; i++) {
this_sequence = new ArrayList<Integer>();
n = i;
this_sequence.add(n);
while (n != 1) {
if (n % 2 == 0) {
n = n / 2;
}
else {
n = 3*n + 1;
}
this_sequence.add(n);
}
if (this_sequence.size() > longest_sequence.size()) {
longest_sequence = this_sequence;
}
}
System.out.println(longest_sequence.get(0));
System.out.println(longest_sequence.size());
}
澄清一点:
在程序的每次迭代中都会创建一个新列表。它要么通过为其分配longest_sequence 来保留,要么被丢弃并被新的列表实例覆盖。
我猜我的假设是不正确的,并且实例正在被保留?列表的大小应该不是问题(最大的列表大约有 500 个元素)。
最佳答案
即使您增加堆空间,它也会失败。
对于 n = 113383,运算使您通过整数限制,n 变为负数,这将以无限循环结束。
如果将 Integer 更改为 Long,则有效。
关于java - Java中的堆内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43698334/