如何在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。