繁体   English   中英

如果在Java中使用长数据类型,则访问数组元素

[英]Accessing an array element if using long datatype in Java

我正在尝试使用Java解决竞争性编程问题。 在涉及数组使用的问题中,我将不得不编写程序,使数组可以容纳大量值(超出int的范围),并且每个数组元素也都超出int范围。 所以我为此花了很长时间 但是如果我尝试访问说

 a[i++] = b[j++];

如果i&j&a&b都是long类型,则会出现以下错误:

  error: possible loss of precision

用于索引访问。

如何访问这些元素? 我尝试使用longint的类型转换来获取索引值,并且错误消失了,但是那也不会影响精度吗?

变量声明如下:

long numTest = in.nextLong();

    long [] sizes = new long[numTest];

在此处输入图片说明

Java语言规范指出,不能将long用作数组索引:

数组必须由int值索引...尝试访问具有长索引值的数组组件会导致编译时错误。

因此,您可以期望最大大小为Integer.MAX_VALUE,但这取决于您的JVM(在进行讨论)

不幸的是,Java无法处理大于2 ^ 31个元素(有符号整数的最大大小)的数组。 无论如何,如此大的数组可能无法容纳在内存中。 让我们考虑这种情况,例如:

Array with 2^32 long elements
Size is 2^32 * 8 bytes = 2^35 bytes = 32 GB (!)

在此示例中,数组大小仅比整数最大值稍大,但我们已经达到32 GB的已用内存。

我认为您应该找到一些替代解决方案,例如内存映射文件或根据需要动态加载部分数据。

我还想链接到此现有答案: https : //stackoverflow.com/a/10787175

Java数组必须由int值索引。 这是语言规范中规定的规则。 因此,如果您使用long作为索引,则编译器将帮助您遵守规则并将其隐式强制为int 这就是为什么您收到此消息。

为了有一个包含数组long对象的号码,您需要阵列的定制实现。

Java允许您创建最大整数范围的数组,因此索引应在整数范围内。

为了实现长距离数组,我建议您使用ArrayLet的概念。 即创建2维数组,其中顶级数组可以帮助您跨越整数范围,例如,请参见下文,

long[][] array = new long[x][Integer.MAX_VALUE];

其中x可以是定义程序所需的Integer.MAX_VALUE值的倍数的任何数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM