我必须使用索引范围为0到33554432的long
数组。
它给出了错误:
"Exception in thread main java.lang.OutOfMemoryError: Java heap space".
short
数组不会出现此错误。我必须使用long
数组和相同的索引,我该怎么办?
答案 0 :(得分:6)
您可以通过使用整数文字访问数组来获得提示。由于整数文字只能达到Integer.MAX_VALUE
,这就是你的数组可以拥有多少个索引(和元素)。 arshajii brings up another hint
您的问题只与您的应用程序没有足够的内存来创建那么多long
但足以创建那么多short
的事实有关。请记住,初始化数组时,其元素也会初始化为默认值。对于原始类型,该值为0
或0.0
。需要考虑的事项(取决于您的环境)
Long[] array = new Long[33554432]; // allocation would work
long[] array = new long[33554432]; // allocation would fail
这是因为引用类型被初始化为null
引用,因此只有引用占用空间。所以你可以开始添加元素,但最终也会失败。
使用更多内存启动应用程序。
答案 1 :(得分:5)
数组索引是int。你得到OOM,因为你的默认堆大小太小了。尝试使用-Xmx512m命令行选项运行java(因为您的数组已经需要8 * 33554432 = 268435456,268 MB)
答案 2 :(得分:2)
数组范围应在int
的最大值范围内。
根据JLS
数组必须用int值索引。 尝试访问具有长索引值的数组组件 导致编译时错误。