我被赋予了一项简单的任务,即编写一个程序,该程序将从给定文件中找到所有斐波那契数,然后返回最大和最小的数。 不幸的是,在尝试执行 Java 堆空间错误时。 我真的不知道错误在哪里,所以你能帮我一下吗? 以及如何避免在未来重复同样的错误。
package maturaWielkanoc;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
public class Zad4 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(0);
list.add(1);
int counter = 1;
while (list.get(list.size() - 1) < 908589244) {
//908589244 is one bigger than the biggest number in dane.txt
list.add(list.get(counter) + list.get(counter));
}
try (BufferedReader br = new BufferedReader(new FileReader("dane.txt"))) {
String line;
List<Integer> answer = new ArrayList<>();
while ((line = br.readLine()) != null) {
int value = Integer.parseInt(line);
if (list.contains(value)) {
answer.add(value);
}
}
answer.sort(null);
System.out.println("Min = " + answer.get(0));
System.out.println("Max = " + answer.get(answer.size() - 1));
} catch (Exception e) {
e.printStackTrace();
}
}
}
最佳答案
您的应用程序将使用固定数量的内存运行,而 List
将在内存中存储和保存数据,不断填充它。您将继续向列表中添加整数,看不到尽头。
快速谷歌显示一个带框的整数是 8 个字节,您的上限是 908589244
个整数。相反,让我们假设您尝试存储 10 亿个整数,即 8 GB,这将很快填满您的堆。
这个任务显然是关于内存管理的一课。您将希望找到一种更好的方法来保存数据并维护最大和最小的斐波那契数,而不是将它们全部存储在内存中(考虑在从文件中读取每个值而不是添加到列表时评估每个数)。
关于java - 斐波那契练习中的堆错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49574532/