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

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

问题描述

我正在阅读有关Java中ArrayList的增长方式的文档.我不明白为什么

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 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_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中 可能会成功) .这样,您几乎可以在几乎所有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天全站免登陆