3

我必须使用long索引范围从 0 到 33554432 的数组。

它给出了一个错误:

"Exception in thread main java.lang.OutOfMemoryError: Java heap space".

short数组没有给出这个错误。我必须使用long数组和相同的索引,我该怎么办?

4

3 回答 3

6

您可以通过使用整数文字访问数组这一事实获得提示。由于整数文字只能达到Integer.MAX_VALUE,这就是你的数组可以有多少索引(和元素)。arshajii 提出了另一个提示

您的问题只是与您的应用程序没有足够的内存来创建那么多longs 但有足够的内存来创建那么多 s 的事实有关short。请记住,当一个数组被初始化时,它的元素也被初始化为一个默认值。对于原始类型,该值为0or 0.0。需要考虑的事项(取决于您的环境)

Long[] array = new Long[33554432]; // allocation would work
long[] array = new long[33554432]; // allocation would fail

这是因为引用类型被初始化为null引用,因此只有引用占用空间。所以你可以开始添加元素,但它最终也会失败。

使用更多内存启动您的应用程序。

于 2013-10-04T20:00:54.700 回答
5

数组索引是 int。您得到 OOM,因为您的默认堆大小太小。尝试使用 -Xmx512m 命令行选项运行 java(因为您的阵列已经需要 8*33554432 = 268435456, 268 MB)

于 2013-10-04T20:00:40.387 回答
2

数组范围应在 的最大值范围内int

根据 JLS

数组必须由 int 值索引。尝试访问具有长索引值的数组组件会导致编译时错误。

于 2013-10-04T19:55:49.573 回答