Java 8 Arraylist hugeCapacity(int)实现 [英] Java 8 Arraylist hugeCapacity(int) implementation
问题描述
我正在阅读有关Java中ArrayList
的增长方式的文档.我不明白为什么
I'm reading the documentation for how ArrayList
s in Java are grown. I don't understand why the hugeCapacity(int minCapacity)
method chooses to return either Integer.MAX_VALUE
or MAX_ARRAY_SIZE
.
通过MAX_ARRAY_SIZE
在类中的定义方式
244 | private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
它与Integer.MAX_VALUE
几乎相同,只是大小相差一个整数(32 bits
).
It's almost the same as Integer.MAX_VALUE
except off by the size of one integer (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 | }
谁能告诉我返回Integer.MAX_VALUE
与MAX_ARRAY_SIZE
的细微区别是什么?无论哪种方式,OutOfMemoryError
都不应该发生吗?
Can anyone tell me what the subtle difference is in returning Integer.MAX_VALUE
versus MAX_ARRAY_SIZE
? Either way, shouldn't an OutOfMemoryError
occur?
推荐答案
最大数组大小被限制为一定数量,该大小因不同的JVM而异,通常小于Integer.MAX_VALUE
.因此,分配Integer.MAX_VALUE
元素数组时,即使您有足够的内存来在大多数JVM上使用OutOfMemoryError
,也是如此. MAX_ARRAY_SIZE
假定在大多数现有JVM上都是有效的数组大小.因此,当ArrayList
的大小接近Integer.MAX_VALUE
时(例如,您有1_500_000_000个以上的元素并且需要扩大一个数组),它将被扩大到此MAX_ARRAY_SIZE
,因此可以成功执行(假设您有足够的内存) .仅当元素数超过MAX_ARRAY_SIZE
时,ArrayList
才会尝试分配Integer.MAX_VALUE
元素的数组(这在大多数JVM上可能会失败,但在某些JVM中 可能会成功) .这样,您几乎可以在几乎所有JVM上安全地添加最多MAX_ARRAY_SIZE
的元素,只有这样才会出现问题.
The maximal array size is limited to some number which varies across different JVMs and usually is slightly less than Integer.MAX_VALUE
. So allocating the array of Integer.MAX_VALUE
elements you will have OutOfMemoryError
on most of JVMs even if you have enough memory to do it. MAX_ARRAY_SIZE
assumes to be valid array size on the most of existing JVMs. So when ArrayList
size approaches to Integer.MAX_VALUE
(for example, you have more than 1_500_000_000 elements and need to enlarge an array), it's enlarged to this MAX_ARRAY_SIZE
, so it can be successfully performed (assuming you have enough memory). Only if number of elements exceeds MAX_ARRAY_SIZE
, the ArrayList
tries to allocate an array of Integer.MAX_VALUE
elements (which will likely to fail on most of JVMs, but may succeed on some of them). This way you can safely add elements up to MAX_ARRAY_SIZE
on almost any JVM and only after that will have problems.
这篇关于Java 8 Arraylist hugeCapacity(int)实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!