vector和arraylist的核心差异在于线程安全机制(vector方法级synchronized,arraylist无同步)与扩容策略(vector默认2倍,arraylist1.5倍),直接影响性能、内存与适用场景。

Vector 和 ArrayList 虽都实现 List 接口、底层用动态数组,但核心差异集中在两个刚性维度:线程安全机制和扩容策略。这两个点直接决定性能表现、内存行为与适用边界,不能仅凭“Vector 安全、ArrayList 快”做取舍。
线程安全不是“有无”,而是“怎么实现”
Vector 的线程安全靠 每个 public 方法加 synchronized,比如 add()、get()、size() 全部独占对象锁。这意味着哪怕只是读一个元素,也要抢锁、挂起、唤醒——高并发下极易成为瓶颈,且无法规避逻辑竞态(如遍历时 remove 仍抛 ConcurrentModificationException)。
ArrayList 完全不处理同步,单线程零开销,但多线程裸用必然出错:可能丢数据、索引越界、甚至数组内容被覆盖。
现代替代方案更精准:
- Collections.synchronizedList(new ArrayList()):提供等效方法级同步,但允许你把同步块缩小到真正需要的代码段
- CopyOnWriteArrayList:读操作无锁,写操作复制整个数组——适合读远多于写的场景(如配置监听列表)
- 不推荐用 Vector 替代这些方案,它不是“更安全”,只是“更重”
扩容倍数影响内存效率与 GC 频率
Vector 默认扩容为 2 倍(例如 10 → 20 → 40 → 80),翻倍增长快,但容易浪费空间。添加第 16 个元素时,Vector 已分配 40 个槽位,空闲率达 60%;大容量下频繁触发 Full GC 风险升高。
ArrayList 扩容为 1.5 倍向上取整(10 → 15 → 22 → 33 → 49…),节奏更平缓,内存利用率高,对 GC 更友好。
额外细节:
- Vector 构造时可传 capacityIncrement(如 new Vector(10, 5)),每次只加 5,但极少被使用,多数人依赖默认翻倍
- ArrayList 初始容量在 JDK 12+ 中为 0,首次 add 才设为 10;Vector 始终默认初始容量为 10
实际选型建议很明确
新项目一律优先用 ArrayList,搭配明确的并发控制手段。Vector 仅适用于两类场景:
- 维护遗留系统,原有代码强依赖 Vector 特定行为(如某些老框架内部调用其枚举器或 legacy 方法)
- 极少数需“方法粒度同步语义”的胶水层逻辑,且确认并发压力极低
盲目用 Vector 求稳妥,常导致查询变慢 3 倍;裸用 ArrayList 处理多线程写入,则大概率丢失数据。关键不在“用哪个”,而在“为什么这么用”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











