Java新字节数组,大小为2 ^ 32

时间:2012-11-16 18:43:01

标签: java

在Java中,它不允许我使用long这样的东西:

long size = 0xFFFFFFFF; //2^32-1

byte [] data = new byte[size];

int只能高达0x7FFFFFFF(2 ^ 31-1)。是否可以声明这个大小的字节数组?

6 个答案:

答案 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值。