我是java新手,我想在java中使用大型输入大小的数组。但在给我一些运行时错误 - NZEC,我不知道它,我也做了一些关于这个错误的研究,但没有发现任何与我的问题相关的事。
long n=sc.nextLong();// n can be upto 10^9;
long a[]=new long[n];// declaring array of n;
我也面临编译时错误:
error: incompatible types: possible lossy conversion from long to int
任何人都可以解决我的问题吗?
答案 0 :(得分:1)
数组大小限制为int
大小(即大约20亿)。您正尝试使用long
初始化一个。请将尺寸读入int
或使用long a[]=new long[(int)n];
投放长尺寸。
我建议前者避免任何微妙的错误。
答案 1 :(得分:0)
Java中数组的大小属于int
类型。由于long
可以包含的数据多于int
,因此从long
转换为int
时,某些数据可能会丢失。
答案 2 :(得分:0)
由于数组大小限制为整数最大值,因此无法使用long指定数组索引,但只能使用int指定
但在你的情况下它不应该是一个问题,因为整数最大值是2^31-1.
(超过20亿)并且你的要求低于:10^9
(10亿)。
所以替换它应该没问题:
long n=sc.nextLong();// n can be upto 10^9;
通过
int n=sc.nextInt();// n can be upto 10^9;
答案 3 :(得分:0)
数组大小限制为java中的int大小。所以你需要始终使用int size创建数组。你必须把n作为int。并替换长n=sc.nextLong();// n can be upto 10^9;
by int n=sc.nextInt();// n can be upto 10^9;
它会完美运作。
答案 4 :(得分:0)
首先,拥有如此庞大的阵列可能效率低下。可以用更好的数据结构替换它,这将有助于您的用例。可能是受到攻击的整体问题,如果提供可以帮助以更有效的方式解决它。
答案 5 :(得分:0)
正如其他答案所建议的那样,数组索引是基于int
的,并且数组可能不是您想要做的任何数据结构。
让我们考虑内存使用情况。数组有一个12字节的对象标题,后跟n * v
个字节用于实际数据(其中n
是数组大小,v
是您要存储的类型的大小在它)。
例如,让我们考虑以下数组声明:
long[] longArray = new long[Integer.MAX_VALUE];
long有64位,或8个字节。 Integer.MAX_VALUE等于2147483647.这意味着您的数组将占用17179869188个字节,换句话说就是17 GB的RAM。
是否可以创建更大的数组?当然:你可以制作一个多维数组(每个额外的维度会将可用位置乘以Integer.MAX_VALUE),但内存使用情况会非常糟糕。请考虑以下示例:
long[] multiArray = new long[5][5];
这个数组有25个位置,所以根据我之前的公式你可能认为它需要25 * 8 + 12
个字节或212
个字节,但是一个二维数组是一个数组数组,所以每个内部数组还有一个对象标题,所以我们正在说(5 * 8 + 12) * 5 + 12
个字节或272
个字节。现在想象一下在更大的层次上做这件事。
long[] multiArray = new long[Integer.MAX_VALUE][Integer.MAX_VALUE];
这需要(Integer.MAX_VALUE * 8 + 12) * Integer.MAX_VALUE + 12
个字节,或3.689348813882917e19个字节(36.89艾字节,或36.89亿个GB)。
如果您确实需要使用这些数据量,则可能需要计算群集,而不是阵列。