ArrayList 可以包含比 int 最大值更多的元素吗?

M. *_*awy 5 java heap int arraylist max

我正在测试 Java (SE7) 如何int通过以下代码处理超过其最大值的 :

int index = 2147483647;//the maximum value of int
long size = 2147483648L; //More than the maximum value of int by 1
int safeCounter=0; //To prevent the infinite loop
while (index<size)
{
    System.out.println("Index now is : "+index);//show the int value
    index++; //increment the int value
    safeCounter++; //increment the number of desired loops
    if (safeCounter==3){
        break;//to break the loop after 3 turns
    }

}
Run Code Online (Sandbox Code Playgroud)

我得到的是:

现在的索引是:2147483647 现在的索引是:-2147483648 现在的索引是:-2147483647

因此,在对此感到困惑之后,(如果我不使用safeCounter它,它将在最大值和最小值之间永远保持下去int——并且不会抛出异常)我想知道如何ArrayList处理元素数量超过最大值int(假设堆空间不是问题)?如果ArrayList不能处理这个,还有其他数据结构可以吗?


你能解释一下我从int变量中得到的行为吗?

Ste*_*n C 5

ArrayList 可以包含比 int 最大值更多的元素吗?

在实践中没有。ArrayList 由单个 Java 数组支持,数组的最大大小为Integer.MAX_VALUE.

(假设,Oracle 可以在ArrayList不破坏用户代码的情况下重做使用数组数组的实现。但他们这样做的机会非常小。)

ALinkedList可以处理您在内存中表示的尽可能多的元素。或者您可以实现自己的列表类型。事实上,你甚至可以实现一个列表类型,它可以容纳比你可以存储在内存中更多的元素……或者甚至是无限数量的元素,如果你的列表实际上是一个生成器。

size()返回int结果(等等)的事实实际上并不是障碍。List API 规范处理这种异常。


简单解释了您的代码的行为。Java 中的整数运算具有无声溢出。如果将整数类型的最大正值加 1,它会环绕到最大的负值;即 MAX_VALUE + 1 == MIN_VALUE ... 对于整数类型。