超越Java中的Integer.MAX_VALUE约束

时间:2009-05-12 10:56:21

标签: java collections integer stringbuilder max

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

例如:

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

6 个答案:

答案 0 :(得分:9)

如果你有一个巨大的收藏品,你将会遇到各种实际限制,然后才会有231 - 1个项目。一个拥有一百万件物品的藏品将会非常笨拙,更不用说超过千万件的物品了。

类似地,StringBuilder可以在达到MAX_VALUE限制之前构建一个大小为2GB的String,这对于任何实际目的都是足够的。

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

答案 1 :(得分:3)

很长?适合我。

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

使用分页算法。

巧合的是,最近在另一个问题Binary search in a sorted (memory-mapped ?) file in java上,我掀起了一种分页算法来绕过java.nio中的 int 参数。 MappedByteBuffer API。

答案 2 :(得分:3)

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

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

答案 3 :(得分: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实际上不是限制因为你需要大量内存来实际达到极限。如果您达到此限制,您可能需要考虑改进算法和/或数据布局:)

答案 4 :(得分:1)

是的,使用BigInteger类。

答案 5 :(得分:1)

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