抛开堆的容量不谈,有没有办法超越 Java 中的 Integer.MAX_VALUE 限制?

例子有:

  1. 集合将自身限制为 Integer.MAX_VALUE。
  2. StringBuilder / StringBuffer 将自身限制为 Integer.MAX_VALUE。
有帮助吗?

解决方案

如果你有一个巨大的收藏,你就会在拥有之前就遇到各种实际限制。 231 - 1 里面的物品。一个包含 100 万件物品的集合将非常笨重,更不用说一个数量超过数千倍的集合了。

类似地,StringBuilder 可以在到达之前构建一个大小为 2GB 的字符串。 MAX_VALUE 对于任何实际目的来说都绰绰有余的限制。

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

其他提示

带长?对我有用。

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

具有分页算法。

巧合的是,最近又有一个问题 (java中排序(内存映射?)文件中的二分查找), ,我提出了一种分页算法来解决 整数 java.nio.MappedByteBuffer API 中的参数。

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

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

大批 索引 受 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 并不是真正的限制,因为您需要大量内存才能真正达到限制。如果您达到此限制,您可能需要考虑改进您的算法和/或数据布局:)

是的,使用 BigInteger 类。

内存升级是必须的.​​.:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top