Java 转换';int';至';长';或者使用'访问太长的数组;长';

Java 转换';int';至';长';或者使用'访问太长的数组;长';,java,arrays,int,long-integer,Java,Arrays,Int,Long Integer,假设我有一个足够长的数组,可以用int访问它的任何索引,有没有办法用long访问这样一个数组的索引?Java如何处理这种数组?例如: int[] a = new int[]{1,5,2,4........9,2,1} 假设在上述数组中,9,2,1位于超出int(231)范围的索引处。 我如何访问这些元素?您不会-数组索引在Java中总是int值。它不允许包含超过Integer.MAX\u VALUE元素的数组 数组的长度由length字段表示,该字段的类型为int。因此,不可能创建长度大于In

假设我有一个足够长的数组,可以用
int
访问它的任何索引,有没有办法用
long
访问这样一个数组的索引?Java如何处理这种数组?例如:

int[] a = new int[]{1,5,2,4........9,2,1}
假设在上述数组中,
9,2,1
位于超出
int
(231)范围的索引处。
我如何访问这些元素?

您不会-数组索引在Java中总是
int
值。它不允许包含超过
Integer.MAX\u VALUE
元素的数组

数组的长度由
length
字段表示,该字段的类型为
int
。因此,不可能创建长度大于
Integer.MAX\u VALUE
的数组


没有显式地调用它,但是您可以从所涉及的类型中推断出来。

您不能有这么长的数组。但这一想法是为该项目提出的

数组必须按
int
值进行索引
short
byte
char
值也可以用作索引值,因为它们经过一元数字升级,成为
int
尝试使用
索引值访问数组组件会导致编译时错误


资源:

  • -

如其他人所述,长度和索引值必须为整数。如果你真的需要这个,还有一些变通方法。例如,可以有一个非常大的int数组数组。然后,您可以对long执行一些模运算,以确定需要哪个数组以及该数组中需要哪个索引。

如果需要自定义数据结构,请尝试以下操作:

/**
* Because java uses signed primitives only the least significant 31 bits of an int are used to index arrays,
* therefore only the least significant 62 bits of a long are used to index a LongArray
* 
* @author aaron
*/
public class LongArray<Element> {

    //inclusive
    public static final long maximumSize = (~0)>>>2;//0x 00 FF FF FF  FF FF FF FF
    public static final long minimumSize = 0;

    //Generic arrays are forbidden! Yay dogma!
    private Object[][] backingArray;

    private static int[] split(long L) {
        int[] rtn = new int[2];
        rtn[1] = Integer.MAX_VALUE & (int)(L>>7);
        rtn[0] = Integer.MAX_VALUE & (int)L;
        return rtn;
    }
    private static long join(int[] ia) {
        long rtn = 0;
        rtn |= ia[0];
        rtn <<= 7;
        rtn |= ia[1];
        return rtn;
    }

    private static boolean isValidSize(long L) {
        return L<=maximumSize && L>=minimumSize;
    }

    public LongArray(long size){
        if (!isValidSize(size)) throw new IllegalArgumentException("Size requested was invalid, too big or negative");

        //This initialises the arrays to be only the size we need them to be
        int[] sizes = split(size);
        backingArray = new Object[sizes[0]][];
        for (int index = 0; index<backingArray.length-1; index+=1) {
            backingArray[index] = new Object[Integer.MAX_VALUE];
        }
        backingArray[backingArray.length-1] = new Object[sizes[1]];
    }

    public Element get(long index) {
        int[] ia = split(index);
        return (Element)backingArray[ia[0]][ia[1]];
    }
    public void set(long index, Element element) {
        int[] ia = split(index);
        backingArray[ia[0]][ia[1]] = element;
    }

}
/**
*因为java使用有符号原语,所以只有int的最低有效31位用于索引数组,
*因此,只有long的最低有效62位用于索引LongArray
* 
*@作者亚伦
*/
公共类长数组{
//包容的
公共静态最终长最大值=(~0)>>>2;//0x 00 FF FF FF FF
公共静态最终长最小尺寸=0;
//禁止使用通用数组!耶,教条!
私有对象[][]备份阵列;
私有静态int[]拆分(长L){
int[]rtn=新的int[2];
rtn[1]=整数.MAX_值&(int)(L>>7);
rtn[0]=整数.MAX_值和(int)L;
返回rtn;
}
专用静态长联接(int[]ia){
长rtn=0;
rtn |=ia[0];

我也在寻找的rtn:p规范在谈到数组创建表达式时确实提到了它:“维度表达式的类型不能太长。”@Jon Skeet,它是在规范中指定的。但它不是真正明确的。列表/集合是否也有限制?如果在大于MAX_值的列表/集合上排列会发生什么情况?@willcodejavaforfood:Well
List.get()
采用
int
索引…我认为任何集合都不会处理超过20亿个元素。