抛开堆的容量,有没有办法超越 Java 中的 Integer.MAX_VALUE 约束?
例子是:
- 集合将自身限制为 Integer.MAX_VALUE。
- StringBuilder / StringBuffer 将自己限制为 Integer.MAX_VALUE。
抛开堆的容量,有没有办法超越 Java 中的 Integer.MAX_VALUE 约束?
例子是:
如果您有一个庞大的收藏,那么在您拥有2 31 - 1个项目之前,您将达到各种实际限制。一个包含一百万个项目的集合将非常笨重,更不用说一个超过数千倍的集合了。
类似地,StringBuilder 可以构建一个大小为 2GB 的字符串,然后再达到MAX_VALUE
对于任何实际用途都绰绰有余的限制。
如果您真的认为您可能会达到这些限制,您的应用程序应该以不同的方式存储您的数据,可能在数据库中。
用长?为我工作。
编辑:啊,澄清问题。凉爽的。我的新的和改进的答案:
带有分页算法。
巧合的是,最近为了另一个问题(在 java 中的排序(内存映射?)文件中的二进制搜索),我启动了一个分页算法来绕过 java.nio.MappedByteBuffer API 中的int参数。
您可以根据这些集合的源代码创建自己的具有长 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 类。
内存升级是必要的.. :)