为什么Java ArrayList中的ensureCapacity()使用const 1.5或(oldCapacity * 3)/ 2 + 1扩展容量?
答案 0 :(得分:6)
调整阵列大小是一项相对昂贵的操作。它希望尝试确保如果使用ensureCapacity(11)
,ensureCapacity(12)
,ensureCapacity(13)
调用方法,则不应每次都调整数组大小。所以它通过合理的块(增加50%)而不是指定的最小值来调整大小。
答案 1 :(得分:3)
主要原因在于将一系列元素添加到列表中的(渐近)复杂性。
请注意,add
方法在内部调用ensureCapacity(size+1)
。当内部数组的大小增加时,所有元素都必须复制到新的更大的数组中。
如果尺寸仅增加了金额(每次调用add
时为1),那么添加 n 元素会有 O(n 2 )的复杂性。
相反,大小总是以常量因子增加。然后,添加 n 元素的复杂性仅为 O(n)。