4

抛开堆的容量,有没有办法超越 Java 中的 Integer.MAX_VALUE 约束?

例子是:

  1. 集合将自身限制为 Integer.MAX_VALUE。
  2. StringBuilder / StringBuffer 将自己限制为 Integer.MAX_VALUE。
4

6 回答 6

9

如果您有一个庞大的收藏,那么在您拥有2 31 - 1个项目之前,您将达到各种实际限制。一个包含一百万个项目的集合将非常笨重,更不用说一个超过数千倍的集合了。

类似地,StringBuilder 可以构建一个大小为 2GB 的字符串,然后再达到MAX_VALUE对于任何实际用途都绰绰有余的限制。

如果您真的认为您可能会达到这些限制,您的应用程序应该以不同的方式存储您的数据,可能在数据库中。

于 2009-05-12T11:06:14.607 回答
3

用长?为我工作。

编辑:啊,澄清问题。凉爽的。我的新的和改进的答案:

带有分页算法。

巧合的是,最近为了另一个问题在 java 中的排序(内存映射?)文件中的二进制搜索,我启动了一个分页算法来绕过 java.nio.MappedByteBuffer API 中的int参数。

于 2009-05-12T10:58:22.733 回答
3

您可以根据这些集合的源代码创建自己的具有长 size() 的集合。例如,要拥有更大的对象数组,您可以拥有一个数组数组(并将它们拼接在一起)

这种方法将允许几乎 2^62 个元素。

于 2009-05-12T18:26:08.680 回答
2

数组索引受 Integer.MAX_VALUE 限制,而不是数组的物理大小。

因此,数组的最大大小与数组类型的大小相关联。

byte = 1 byte => max  2 Gb data
char = 2 byte => max  4 Gb data
int  = 4 byte => max  8 Gb data
long = 8 byte => max 16 Gb data

字典是另一回事,因为它们经常使用诸如存储桶之类的技术或将内部数据布局用作树。因此,这些“限制”通常不适用,否则您将需要更多数据才能达到限制。

简短: Integer.MAX_VALUE 并不是真正的限制,因为您需要大量内存才能真正达到限制。如果您达到此限制,您可能需要考虑改进您的算法和/或数据布局:)

于 2009-05-12T11:36:35.557 回答
1

是的,使用 BigInteger 类。

于 2009-05-12T10:58:55.960 回答
1

内存升级是必要的.. :)

于 2009-05-12T11:55:00.320 回答