你能用long int索引数组吗?

Mar*_*vek 10 java arrays

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

我的意思是在代码中贬低.

long x = 20;
char[] array = new char[x];
Run Code Online (Sandbox Code Playgroud)

要么

long x = 5;
char res;
res = array[x];
Run Code Online (Sandbox Code Playgroud)

Joe*_*oel 10

如果您查看10.4 中的Java文档:

数组必须用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
Run Code Online (Sandbox Code Playgroud)

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


m3t*_*man 6

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

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

也有传言说 JVM 和语言的未来版本将支持 size 数组long


Aug*_*ust 5

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

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

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

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

如果你想使用a long,你必须int先将它强制转换为:

char[] array = new char[(int) x];
res = array[(int) x];
Run Code Online (Sandbox Code Playgroud)