如何在java

时间:2017-02-17 15:00:39

标签: java arrays

我是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

任何人都可以解决我的问题吗?

6 个答案:

答案 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)。

如果您确实需要使用这些数据量,则可能需要计算群集,而不是阵列。

相关问题