将“int”转换为“long”或使用“long”访问过长的数组

4

假设我有一个数组,它的长度足够长,可以使用int访问其任何索引,是否有办法通过long访问这种类型数组的索引?而Java如何处理这种类型的数组呢?例如:


int[] a = new int[]{1,5,2,4........9,2,1}

假设在上述数组中,9,2,1 的索引超出了 int (231)的范围。 我该如何访问这些元素?
4个回答

6
您不能这样做 - 在Java中,数组索引始终是int值。它不允许具有超过Integer.MAX_VALUE元素的数组。
数组的长度由类型为intlength字段表示。因此,不可能创建长度大于Integer.MAX_VALUE的数组。 spec没有明确说明这一点,但可以从涉及的类型推断出来。

我也在寻找的是这个:http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html - wds
@Jon Skeet,规范中有说明。但它并不是非常明确。 - Colin Hebert
列表/集合也有限制吗?如果对一个大于MAX_VALUE的列表/集合执行toArray操作会发生什么? - willcodejavaforfood
@willcodejavaforfood:好吧,List.get()需要一个int索引...我认为没有任何集合可以处理超过20亿个元素。 - Jon Skeet
你真的有一个超过20亿元素的数组吗?即使现代计算机拥有巨大的内存空间,这似乎有点过分。我想知道这是一个真实的应用程序还是一个假设性的问题。比如说,你有一个记录世界上每个人的表格之类的东西吗? - Jay
显示剩余3条评论

0
你需要一个自定义的数据结构,试试这个:
/**
* 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;
    }

}

0

0

正如其他人所提到的,长度和索引值必须是整数。如果你真的需要这个,有一些变通方法。例如,你可以有一个非常大的整数数组的数组。然后,你可以对长整型进行一些模算术运算,以确定你想要哪个数组以及该数组中所需的索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接