vector 的 add 方法比 arraylist 慢,因其所有公共方法均加 synchronized 锁,单线程下纯属性能负担;扩容策略上 vector 默认×2易致内存浪费,而 arraylist ×1.5 更均衡;且其粗粒度同步已被更高效的并发集合替代。

Vector 的 add 方法为什么总比 ArrayList 慢?
因为 Vector 的几乎所有公共方法(包括 add、get、remove)都加了 synchronized,每次调用都要竞争锁;而 ArrayList 完全没这层开销。单线程下,这个同步就是纯负担。
- 即使你只在主线程里反复
add一万个元素,Vector 也会为每一次操作进入/退出临界区,而 ArrayList 直接写数组 - 如果真需要多线程安全,用
Collections.synchronizedList(new ArrayList())或更现代的CopyOnWriteArrayList,别硬扛 Vector - 注意:Vector 的同步是「方法级」的,不是「操作级」的——比如遍历中删除,仍可能抛
ConcurrentModificationException,它不解决逻辑竞态
扩容时 ArrayList 和 Vector 的容量翻倍策略怎么影响内存?
ArrayList 扩容是 ×1.5,Vector 默认 ×2(未指定 capacityIncrement 时)。这意味着同样从 10 个元素开始连续添加,Vector 很快就会分配远超所需的空间。
- 例如:初始容量 10,加到第 11 个元素时,ArrayList 扩到 15,Vector 扩到 20;加到第 16 个时,ArrayList 到 22,Vector 直接到 40
- Vector 若构造时传了
capacityIncrement=5,那每次只 +5,但多数人不这么用,结果就是空间浪费更隐蔽 - ArrayList 的 1.5 倍是权衡了扩容频率和内存占用,实测中更“温和”;Vector 的翻倍在早期硬件小内存时代有道理,现在反而容易触发 GC 频繁回收大块空闲数组
为什么现在几乎没人用 Vector 写新代码?
不是它不能用,而是它的设计目标(线程安全 + 简单同步)已被更精细的并发工具替代,而它付出的性能代价又没换来足够优势。
- JDK 1.2 就有了 ArrayList,Vector 是 JDK 1.0 的遗留;所有主流框架(Spring、MyBatis、Jackson)内部都用 ArrayList,文档、示例、IDE 提示也默认指向它
- Vector 的线程安全是「粗粒度」的:整个 list 被一把锁包住,高并发下成了瓶颈;而
ConcurrentHashMap或CopyOnWriteArrayList是按需分段或写时复制,实际吞吐高得多 - 如果你在代码里看到
Vector,大概率是老项目没动过,或者某位同事误以为“带 V 就是更高级”——它连Arrays.asList()返回的List都不如灵活
真要兼容旧 Vector 接口,该怎么平滑替换?
Vector 实现了 List 接口,所以只要不直接调用 capacity()、ensureCapacity() 这类独有方法,就能用 ArrayList 替换。
立即学习“Java免费学习笔记(深入)”;
- 检查代码里有没有
v.capacity()或v.elementAt(i)—— 这俩 ArrayList 没有,得换成v.size()和v.get(i) - 如果用了
v.removeAllElements(),对应改用v.clear()即可,语义一致 - 最危险的是隐式依赖:比如某个类把
Vector当参数传入,又在内部调用了clone(),而 ArrayList 的clone()是浅拷贝,行为一致,但若下游逻辑误以为是深拷贝,就埋雷了










