如何在java中获取大型数组
我是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
任何人都可以解决我的这个问题?
数组大小限制为java中的int大小。 所以你需要始终使用int size创建数组。 你必须把n作为int。 并替换long n=sc.nextLong();// n can be upto 10^9;
by int n=sc.nextInt();// n can be upto 10^9;
它会很完美。
数组大小限制为int
大小(即大约20亿)。 你试图用long
初始化一个。 要么将大小读入int
要么将long转换为long a[]=new long[(int)n];
。
我建议前者避免任何微妙的错误。
Java中数组的大小是int
类型。 由于long
可以容纳比int
更多的数据,因此从long
转换为int
时,某些数据可能会丢失。
数组索引不能像你一样用long指定,但只能用int指定,因为数组大小限制为Integer最大值
但在你的情况下它应该不是一个问题,因为整数最大值是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;
拥有如此大的arrays可能首先是低效的。 可以用更好的数据结构替换它,这将有助于您的用例。 可能是被攻击的整体问题,如果提供可以帮助以更有效的方式解决它。
正如其他答案所建议的那样,数组索引是基于int
的,并且数组可能不是您想要做的任何事情的正确数据结构。
让我们考虑内存使用情况。 一个数组有一个12字节的对象头,后面是实际数据的n * v
字节(其中n
是数组大小, v
是你存储在其中的类型的大小)。
例如,让我们考虑以下数组声明:
long[] longArray = new long[Integer.MAX_VALUE];
long有64位,或8个字节。 Integer.MAX_VALUE等于2147483647.这意味着您的数组将占用17179869188字节,或者换句话说17 GB的RAM。
是否可以创建更大的arrays? 当然:你可以制作一个多维数组(每个额外的维度会将可用位置乘以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)。
如果您确实需要使用这些数据量,则可能需要计算群集,而不是arrays。