Java 8 Arraylist hugeCapacity(int) 实现 [英] Java 8 Arraylist hugeCapacity(int) implementation
问题描述
我正在阅读有关 Java 中 ArrayList
如何增长的文档.我不明白为什么 hugeCapacity(int minCapacity)
方法选择返回 Integer.MAX_VALUE
或 MAX_ARRAY_SIZE
.
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 位
).
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 上安全地添加最大 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屋!