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
值尝试使用长
索引值访问数组组件会导致编译时错误
资源:
- -
/**
* 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:WellList.get()
采用int
索引…我认为任何集合都不会处理超过20亿个元素。