在Java中,它不允许我使用long这样的东西:
long size = 0xFFFFFFFF; //2^32-1
byte [] data = new byte[size];
int只能高达0x7FFFFFFF(2 ^ 31-1)。是否可以声明这个大小的字节数组?
答案 0 :(得分:7)
答案是NO
,因为这是最大可能的初始化:
int size = Integer.MAX_VALUE;
byte [] data = new byte[size];
答案 1 :(得分:3)
将size
声明为int
,然后重试:
int size = 0x7FFFFFFF; // 0x7FFFFFFF == Integer.MAX_vALUE == 2^32-1
只能声明数组的大小为int
,而不是long
。请注意,假设有足够的可用内存,最大int
正值(因此,整数数组的最大可能大小)为0x7FFFFFFF == Integer.MAX_vALUE
。
答案 2 :(得分:2)
您的示例中的问题是数组创建函数需要一个int作为参数,并且您传递的是long。
编译:
long size = 0xFFFFFFFF; //2^32-1
byte [] data = new byte[(int)size];
但是没有跑。它不会在long
的这个特定示例中运行,因为数字是负数,并且您根本无法创建具有负数元素的数组。但是,仍然可以使用long变量来创建数组,但它需要是一个正数,需要转换为int,如下所示:
long size = 0x00FFFFFF; //
byte [] data = new byte[(int)size];
将编译和工作。
顺便说一句,如果超出JVM内存限制,则从大小更改为Integer.MAX_VALUE
将无法实现。
答案 3 :(得分:2)
Integer.MAX_VALUE是许多java概念的限制。例如,字符串/列表不能超过该值。
早在1995年Java创建时,4MB总内存就是常态。
大多数语言都存在同样的问题。但如果我们今天要设计一种新语言,我们当然会使用long
。
答案 4 :(得分:2)
我同意你不能拥有超过Integer.MAX_VALUE元素的byte []。但是,您可以拥有一个数组数组。
我建议写一个课程:
一个构造函数,它采用较长的大小并构建一个足够大的byte [] [] 包含那么多元素。
获取并设置使用长索引的方法
返回long的size()方法。
当然,这只适用于64位JVM和足够大的内存。
我甚至感觉到在1990年代,对数组索引和长度类型的int而不是long的选择是短视的。 Sun出售了许多具有数十GB内存的机器,并且最大阵列大小接近内存大小以及内存大小增长的趋势一直存在。
答案 5 :(得分:1)
这是不可能的。 数组大小仅支持int值。
您可以查看JDK source code for arrays。仅支持int值。