gpt4 book ai didi

Java 8 Arraylist hugeCapacity(int) 实现

转载 作者:太空狗 更新时间:2023-10-29 22:55:58 25 4
gpt4 key购买 nike

我正在阅读有关如何在 Java 中生成 ArrayList 的文档。我不明白为什么 hugeCapacity(int minCapacity)方法选择返回 Integer.MAX_VALUEMAX_ARRAY_SIZE

根据 MAX_ARRAY_SIZE 在类中的定义,

244 |     private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

它几乎与 Integer.MAX_VALUE 相同,只是差了一个整数的大小(32 位)。

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 吗?

最佳答案

最大数组大小被限制为某个数字,该数字在不同的 JVM 之间有所不同,通常略小于 Integer.MAX_VALUE。因此,即使您有足够的内存来分配 Integer.MAX_VALUE 元素的数组,您也会在大多数 JVM 上遇到 OutOfMemoryErrorMAX_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 的元素,只有在那之后才会出现问题。

关于Java 8 Arraylist hugeCapacity(int) 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35582809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com