将'int'转换为'long'或使用'long'访问太长的数组

时间:2010-10-15 15:15:07

标签: java arrays int long-integer

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

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

在上面的数组中假设9,2,1的索引超出了int(2 31 )的范围。 我如何访问这些元素?

4 个答案:

答案 0 :(得分:5)

你不会 - Java中的数组索引始终是int值。它不允许具有超过Integer.MAX_VALUE个元素的数组。

数组的长度由length字段表示,该字段的类型为int。因此,无法创建长度大于Integer.MAX_VALUE的数组。

spec没有明确地将其解析出来,但您可以从相关类型中推断出来。

答案 1 :(得分:0)

你不能拥有那么长的数组。但是这个想法已经被提出用于项目硬币。

  

数组必须按int值编制索引; shortbytechar值也可用作索引值,因为它们需要一元数字促销(§5.6.1)并成为int值。 尝试访问具有long索引值的数组组件会导致编译时错误


资源:

答案 2 :(得分:0)

正如其他人所提到的,长度和索引值必须是整数。如果你确实需要这个,那么有一些解决方法。例如,您可以拥有一个非常大的int数组数组。然后你可以在long上做一些模运算来确定你想要哪个数组以及那个数组中需要哪个索引。

答案 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;
    }

}