应优先选用 arraylist,vector 仅适用于维护遗留系统或需特定方法语义的极少数场景;因 vector 线程安全靠粗粒度 synchronized、扩容翻倍导致内存浪费,而 arraylist 性能更优、扩容更合理,且现代并发方案更灵活高效。

Vector 是线程安全的,ArrayList 不是;Vector 默认扩容为 2 倍,ArrayList 是 1.5 倍。这两个差异直接决定了它们在实际项目中的适用场景——绝大多数新代码应选 ArrayList,Vector 仅用于极少数需兼容旧逻辑的场合。
线程安全机制本质不同
Vector 的每个公共方法(add、get、remove 等)都加了 synchronized,属于粗粒度方法级同步:整把锁包住整个操作,高并发下容易成为瓶颈。它不解决逻辑竞态问题,比如边遍历边删除仍可能抛 ConcurrentModificationException。
ArrayList 完全无同步开销,单线程性能明显更高。若真需线程安全,推荐用更现代的方式:
- Collections.synchronizedList(new ArrayList()) —— 提供等效的 synchronized 包装,但可按需控制同步块范围
- CopyOnWriteArrayList —— 适合读多写少场景,迭代不加锁,写操作复制数组
- 避免直接用 Vector,它不是“更安全”,只是“更重”
扩容策略影响内存与 GC 表现
Vector 默认容量 10,满时扩为 20;再满扩为 40……翻倍增长易造成显著内存浪费。例如从 10 开始连续添加,到第 16 个元素时,Vector 已分配 40 个槽位,其中 24 个空闲。
ArrayList 同样默认初始容量 10(注意:JDK 12+ 无参构造实际初始化为 0,首次 add 才设为 10),扩容按 1.5 倍向上取整:10→15→22→33→49……节奏更平缓,内存利用率高,也减少大数组频繁触发 GC。
Vector 虽支持构造时传 capacityIncrement 控制固定增量(如每次 +5),但极少被使用,多数人只依赖默认翻倍,导致空间浪费更隐蔽。
选型关键看环境与需求
单线程或可控并发环境(如 Spring Bean 内部临时集合),一律优先 ArrayList —— 性能好、生态支持强、文档示例统一。
多线程共享且写操作频繁的场景,Vector 并非合理选择:它的同步粒度太粗,吞吐低。应评估具体读写比例,选用 CopyOnWriteArrayList、并发队列,或配合 ReentrantLock 自定义同步逻辑。
只有两类情况才考虑 Vector:
- 维护遗留系统,调用链中已有 Vector 接口且无法修改上游
- 需要保留 capacity()、ensureCapacity() 等专属方法语义(但这类需求本身已非常罕见)
Vector 是 JDK 1.0 的产物,ArrayList 自 JDK 1.2 引入后就逐步取代了它。所有主流框架(Spring、MyBatis、Jackson)内部均使用 ArrayList,IDE 和静态分析工具也默认提示替换 Vector。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











