你能用long int索引数组吗?

时间:2014-12-06 16:40:35

标签: java arrays

是否有可能使用long int来索引数组?或者这是不允许的?

我的意思是代码中的下方。

long x = 20;
char[] array = new char[x];

long x = 5;
char res;
res = array[x];

3 个答案:

答案 0 :(得分:9)

如果你看一下10.4中的Java Documentation

  

数组必须用int值索引; short,byte或char值可以   也可以用作索引值,因为它们是一元的   数字促销(§5.6.1)并成为int值。

     

尝试访问具有长索引值的数组组件   导致编译时错误。

你会得到的错误看起来像这样:

test.java:12: possible loss of precision
found   : long
required: int
        System.out.println(array[index]);
                                 ^
1 error

如果由于某种原因你有一个存储在long中的索引,只需将它转换为int然后索引你的数组。您无法创建足够大的数组,因此无法通过Java中的整数对其进行索引。所以这里不需要长整数。

答案 1 :(得分:5)

不,这是不可能的。 JLS 15.10声明必须将数组初始值设定项中的表达式提升为int

  

每个维度表达式都经过一元数字推广(第5.6.1节)。 提升类型必须为int,否则会发生编译时错误。

同样适用于数组访问表达式(JLS 15.13):

  

索引表达式经历一元数字提升(第5.6.1节)。 提升类型必须为int,否则会发生编译时错误。

如果您想使用long,则必须先将其转换为int

char[] array = new char[(int) x];
res = array[(int) x];

答案 2 :(得分:3)

从技术上讲,你可以使用Unsafe类来建立这样的结构。有了它,你可以根据需要分配尽可能多的内存(就像你实际上一样)。需要注意的是,这是本机内存而不是堆内存。因此,与典型的数组相比,存在缺点:内存不是垃圾收集的(你需要手动释放内存)并且没有绑定检查所以不小心你可以有seg错误和崩溃你的JVM。

请参阅此处的示例,在Big Array部分:http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

另外有传言称未来版本的JVM和该语言将支持大小为long的数组。