Java 8 Arraylist hugeCapacity(int)实现

Hen*_*Lin 15 java arraylist

我正在阅读有关ArrayListJava 如何发展的文档.我不明白为什么该hugeCapacity(int minCapacity)方法选择返回Integer.MAX_VALUEMAX_ARRAY_SIZE.

MAX_ARRAY_SIZE课堂上的定义来看,

244 |     private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
Run Code Online (Sandbox Code Playgroud)

Integer.MAX_VALUE除了一个整数(32 bits)的大小外几乎相同.

264 |     private static int hugeCapacity(int minCapacity) {
265 |         if (minCapacity < 0) // overflow
266 |             throw new OutOfMemoryError();
267 |         return (minCapacity > MAX_ARRAY_SIZE) ?
268 |             Integer.MAX_VALUE :
269 |             MAX_ARRAY_SIZE;
270 |     }
Run Code Online (Sandbox Code Playgroud)

谁能告诉我的细微差别是什么返回Integer.MAX_VALUEMAX_ARRAY_SIZE?无论哪种方式,都不应该OutOfMemoryError发生?

Tag*_*eev 12

最大数组大小限制为某个数字,这些数字在不同的JVM之间变化,通常略小于Integer.MAX_VALUE.因此,即使你有足够的内存来分配Integer.MAX_VALUE你将OutOfMemoryError在大多数JVM上拥有的元素数组.MAX_ARRAY_SIZE假定在大多数现有JVM上是有效的数组大小.因此,当ArrayList大小接近Integer.MAX_VALUE(例如,您有超过1_500_000_000个元素并需要放大数组)时,它会扩大到此MAX_ARRAY_SIZE,因此可以成功执行(假设您有足够的内存).只有当元素数量超过时MAX_ARRAY_SIZE,ArrayList才会尝试分配一个Integer.MAX_VALUE元素数组(这些元素很可能在大多数JVM上失败,但可能会在其中一些JVM上失败).这样,您可以安全地MAX_ARRAY_SIZE在几乎任何JVM上添加元素,并且只有在此之后才会出现问题.