我正在阅读文档了解如何ArrayList
Java 中的 s 已增长。我不明白为什么hugeCapacity(int minCapacity) http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java#ArrayList.hugeCapacity%28int%29方法选择返回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
).
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
versus MAX_ARRAY_SIZE
?不管怎样,不应该OutOfMemoryError
occur?
最大数组大小限制为某个数字,该数字因不同 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
, the ArrayList
尝试分配一个数组Integer.MAX_VALUE
elements(在大多数 JVM 上可能会失败,但是may其中一些取得了成功)。这样您就可以安全地添加元素最多MAX_ARRAY_SIZE
在几乎所有 JVM 上,只有在那之后才会出现问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)