long size = 0xFFFFFFFF; //2^32-1
byte [] data = new byte[size];
int类型的取值范围最高只能达到0x7FFFFFFF (2^31-1)。是否有可能声明一个这样大小的字节数组?
long size = 0xFFFFFFFF; //2^32-1
byte [] data = new byte[size];
int类型的取值范围最高只能达到0x7FFFFFFF (2^31-1)。是否有可能声明一个这样大小的字节数组?
答案是不
,因为这是最大可能的初始化:
int size = Integer.MAX_VALUE;
byte [] data = new byte[size];
你示例中的问题在于数组创建函数需要一个 int 类型的参数,而你传递了一个 long 类型的参数。
以下代码可以编译通过:
long size = 0xFFFFFFFF; //2^32-1
byte [] data = new byte[(int)size];
但是它不能运行。在这个特定的long
示例中,它无法运行,因为数字是负数,而且你不能用负数元素创建数组。但是仍然可以使用长变量来创建数组,但需要是正数并需要转换为int,如下所示:
long size = 0x00FFFFFF; //
byte [] data = new byte[(int)size];
这样编译和使用都没有问题。
另外,如果将大小更改为Integer.MAX_VALUE
,而此值超过了JVM的内存限制,则不会有任何效果。
java.lang.NegativeArraySizeException
异常,因为(int)size
的值为-1
。 - Yogendra Singh将 size
声明为 int
,然后再试一次:
int size = 0x7FFFFFFF; // 0x7FFFFFFF == Integer.MAX_vALUE == 2^32-1
int
大小,而不是 long
。请注意,最大的 int
正值(因此,整数数组的最大可能大小,假设有足够的内存可用)为 0x7FFFFFFF == Integer.MAX_VALUE
。在许多Java概念中,Integer.MAX_VALUE是限制。例如,String/List的长度不能超过该值。
回到1995年Java创建时,4MB的总内存是常态。
大多数语言都存在同样的问题。但如果我们今天设计一种新语言,肯定会使用long。
这是不可能的。数组大小仅支持int值。
您可以查看JDK源代码中的数组。只支持int值。
我同意您不能使用超过Integer.MAX_VALUE个元素的byte[],但是您可以有一个数组的数组。
我建议编写一个类,该类具有:
一个构造函数,它需要一个long类型的size参数,并构建一个足够大的byte[][]来容纳那么多的元素。
使用long类型的索引的Get和Set方法
一个返回long类型的size()方法。
当然,这仅在64位JVM和足够大的内存的情况下才实用。
我甚至在上世纪90年代就感到,选择int而不是long作为数组索引和长度类型是短视的。Sun公司正在销售许多具有数十GB内存的机器,并且最大数组大小逐渐接近内存大小,内存大小也在增长。