Java 8 Arraylist hugeCapacity(int)实现

时间:2016-02-23 16:26:35

标签: java arraylist

我正在阅读有关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 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

2 个答案:

答案 0 :(得分:12)

最大数组大小限制为某个数字,这些数字在不同的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才会尝试分配MAX_ARRAY_SIZE元素数组(在大多数JVM上可能会失败,但可能取得一些成功)。通过这种方式,您可以在几乎任何JVM上安全地添加import matplotlib.pyplot as plt import numpy as np mn = 10312054216.046213 mz = 91.1876 a1z = 98.330 a2z = 29.571 a3z = 8.396 b1, b2, b3 = -13/(4*pi), 19/(12*pi), 7/(2*pi) b1p, b2p, b3p = -157/(36*pi), 11/(12*pi), 17/(6*pi) c1, c2, c3 = 3/5, 1, 1 ms = np.linspace(100, 10e18, num = 100, endpoint = True) def a1(ms, mn): if (ms < mn): return ( c1*(a1z + b1*np.log(ms/mz)) )**(-1) if (ms >= mn): a1n = ( c1*(a1z + b1*log(mn/mz)) )**(-1) return ( c1*(a1n + b1p*log(ms/mn)) )**(-1) plt.xscale('log') plt.plot(ms, 1/a1(ms, mn)) plt.show() 之前的元素,并且只有在此之后才会出现问题。

答案 1 :(得分:2)

来自Oracle的实现(Java 8更新31):

OutOfMemoryError

他们返回(2 31 - 1) - 8 以确保他们的代码在被另一个VM实现执行时不会创建git fetch --depth=1