9

在 Java 中,它不允许我使用 long 来处理这样的事情:

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

byte [] data = new byte[size];

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

4

6 回答 6

9

答案是NO因为这是最大可能的初始化:

    int size = Integer.MAX_VALUE;
    byte [] data = new byte[size];
于 2012-11-16T18:53:39.210 回答
3

声明size为 an并重int试:

int size = 0x7FFFFFFF; // 0x7FFFFFFF == Integer.MAX_vALUE == 2^32-1

数组只能声明为正int大小,而不是long. 请注意,最大int正值(因此,整数数组的最大可能大小,假设有足够的可用内存)是0x7FFFFFFF == Integer.MAX_vALUE.

于 2012-11-16T18:45:15.077 回答
2

Integer.MAX_VALUE 是许多 java 概念的限制。例如 String/List 不能长于这个。

早在 1995 年创建 Java 时,4MB 的总内存是常态。

大多数语言都存在同样的问题。但如果我们今天要设计一种新语言,我们肯定会使用long.

于 2012-11-16T18:57:27.567 回答
2

我同意您的 byte[] 元素不能超过 Integer.MAX_VALUE 。但是,您可以拥有一个数组数组。

我建议编写一个具有以下内容的类:

  • 一个构造函数,它需要很长的大小并构建一个足够大的 byte[][] 以包含这么多元素。

  • 获取和设置使用长索引的方法

  • 返回 long 的 size() 方法。

当然,这仅适用于 64 位 JVM 和足够大的内存。

早在 1990 年代,我就觉得数组索引和长度类型选择 int 而不是 long 是短视的。Sun 销售了许多具有数十 GB 内存的机器,并且一直存在最大数组大小接近内存大小和内存大小增长的趋势。

于 2012-11-16T19:00:55.887 回答
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];

这将编译和工作。

顺便说一句,Integer.MAX_VALUE如果这超出了您的 JVM 内存限制,则从 size 更改为不会完成任何事情。

于 2012-11-16T18:44:59.337 回答
1

这是不可能的。数组大小仅支持 int 值

您可以查看数组的 JDK 源代码。仅支持 int 值。

于 2012-11-16T18:53:50.513 回答