Java 8 Arraylist hugeCapacity(int) 实现 [英] Java 8 Arraylist hugeCapacity(int) implementation

查看:27
本文介绍了Java 8 Arraylist hugeCapacity(int) 实现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm reading the documentation for how ArrayLists 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_VALUEMAX_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆