Vector默认扩容为旧容量翻倍,ArrayList为旧容量1.5倍;Vector可通过capacityIncrement定制增量扩容,ArrayList不可调;二者均依赖初始容量推迟首次扩容,合理预设初始容量比关注倍数更影响性能。

看默认扩容公式最直接
Vector 默认扩容是翻倍:新容量 = 旧容量 × 2。比如当前容量是 10,扩容后变成 20;如果是 16,就变成 32。
ArrayList 默认扩容是增半:新容量 = 旧容量 +(旧容量 >> 1),也就是旧容量的 1.5 倍。例如容量 10 → 扩容为 15;容量 16 → 变成 24。
注意 Vector 的扩容可定制,ArrayList 不行
Vector 构造时能指定 capacityIncrement,比如 new Vector(10, 5),后续扩容就按“旧容量 + 5”增长,不再翻倍。这种控制更精细,适合预估增长节奏的场景。
ArrayList 没有类似参数,扩容逻辑写死在源码里,始终是 1.5 倍,无法通过构造函数调整。
实际扩容行为受初始容量影响
两者都依赖初始容量来推迟首次扩容。例如:
-
new ArrayList(200)—— 元素加到第 201 个才触发扩容,下一次容量是 300 -
new Vector(200)—— 加到第 201 个时扩容为 400;若用new Vector(200, 10),则扩容为 210
所以光看倍数不够,得结合构造方式和当前 size 判断下一次扩容点。
别被“倍数”字面意思带偏
Vector 的“翻倍”和 ArrayList 的“1.5 倍”都是指数组长度增长比例,不是元素数量或内存占用的精确倍数。两次扩容之间插入的元素越多,单次复制成本越高——因为都要调用 System.arraycopy() 搬移全部有效元素。
频繁小步扩容比偶尔大步扩容更耗性能,所以合理预设初始容量比纠结倍数更重要。










