5

我看到数组的最大大小只能是 Int 的最大大小。为什么 Java 不允许大小为 long-Max 的数组?

long no = 10000000000L;
int [] nums = new int[no];//error here
4

3 回答 3

4

您必须向 Java 设计人员提出“为什么”的问题。其他人只能猜测。我的猜测是,他们认为一个 20 亿个元素的数组应该对任何人都足够(公平地说,可能是这样)。

于 2013-04-10T18:47:25.893 回答
1
  1. int 大小的长度允许包含 2 31 -1(“~20 亿”)个元素的数组。在绝大多数的阵列用途中,这已经足够了。

  2. 这么多元素的数组将占用 2 GB 到 16 GB 的内存,具体取决于元素类型。1995 年 Java 出现时,新的 PC 只有大约 8 兆字节的 RAM。那些 32 位操作系统,即使他们使用磁盘上的虚拟内存,对他们可以分配的连续内存块的大小有一个实际限制,这比 2 GB 小很多,因为其他分配的东西分散在周围在进程的地址空间中。因此,int 大小的数组长度的限制是不可测试的、不可预见的,而且非常遥远。

  3. 在 32 位 CPU 上,整数运算比长整数运算要快得多。

  4. 数组是一种基本的内部类型,它们被大量使用。长尺寸的长度将需要额外的 4 个字节来存储每个数组,这反过来可能会影响在内存中将数组打包在一起,从而可能在它们之间浪费更多字节。(即使更长的长度几乎永远不会有用。)

  5. 如果您确实需要超过 20 亿个项目的内存存储,您可以使用数组数组。

于 2014-06-25T06:05:15.950 回答
-1

不幸的是,Java 不支持超过 2^31 个元素的数组。

即 long[] 数组需要 16 GiB 的空间。

尝试创建这个...

Object[] array = new Object[Integer.MAX_VALUE - 4];

你应该得到 OUTOFMEMMORY 错误...所以最大大小将是Integer.MAX_VALUE - 5

于 2013-04-10T18:52:37.807 回答