是否有可能使用long int来索引数组?或者这是不允许的?
我的意思是代码中的下方。
long x = 20;
char[] array = new char[x];
或
long x = 5;
char res;
res = array[x];
答案 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
的数组。