[英]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
用于索引访问。
如何访问这些元素? 我尝试使用long到int的类型转换来获取索引值,并且错误消失了,但是那也不会影响精度吗?
变量声明如下:
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.