为什么arraylist的新容量是(oldCapacity * 3)/ 2 + 1?

时间:2014-11-14 08:08:55

标签: java arraylist

为什么Java ArrayList中的ensureCapacity()使用const 1.5或(oldCapacity * 3)/ 2 + 1扩展容量?

2 个答案:

答案 0 :(得分:6)

调整阵列大小是一项相对昂贵的操作。它希望尝试确保如果使用ensureCapacity(11)ensureCapacity(12)ensureCapacity(13)调用方法,则不应每次都调整数组大小。所以它通过合理的块(增加50%)而不是指定的最小值来调整大小。

答案 1 :(得分:3)

主要原因在于将一系列元素添加到列表中的(渐近)复杂性。

请注意,add方法在内部调用ensureCapacity(size+1)。当内部数组的大小增加时,所有元素都必须复制到新的更大的数组中。

如果尺寸仅增加了金额(每次调用add时为1),那么添加 n 元素会有 O(n 2 的复杂性。

相反,大小总是以常量因子增加。然后,添加 n 元素的复杂性仅为 O(n)