Vector 与 ArrayList 区别
面试官问:"Vector 和 ArrayList 有什么区别?"
候选人小杜答:"Vector 是线程安全的,ArrayList 不是。"
面试官追问:"那 Vector 怎么保证线程安全的?"
小杜说:"用 synchronized。"
面试官追问:"synchronized 加在哪些方法上?性能怎么样?为什么现在不推荐用 Vector 了?"
小杜支支吾吾答不上来。
【面试官心理】 这道题看似简单,实际上在测试候选人对线程安全和性能的理解。能说出 Vector 用 synchronized 的占 80%,能解释 synchronized 的代价的占 40%,能说出替代方案的只有 20%。
一、核心区别概览 🔴
二、线程安全实现对比 🔴
2.1 Vector 的 synchronized
2.2 ArrayList 的无锁实现
性能差异:synchronized 有锁竞争开销,多线程并发访问 Vector 性能急剧下降。
三、扩容策略对比 🟡
3.1 Vector 扩容 capacity * 2
3.2 ArrayList 扩容 capacity * 1.5 + 1
对比:
四、为什么 Vector 已经过时?🟡
4.1 synchronized 的代价
4.2 替代方案
Collections.synchronizedList 示例:
五、Vector 的适用场景 🟡
5.1 遗留代码兼容
很多老项目还在用 Vector,完全替换成本高。
5.2 需要线程安全且简单场景
5.3 Stack 类(JDK 官方推荐替代)
六、面试官追问 🔴
面试官:"synchronized 加在方法上,和加在代码块上有什么区别?"
标准回答:
synchronized方法:锁住整个对象,所有访问该方法都需要竞争锁synchronized代码块:只锁住代码块,其他方法可以并发访问
面试官追问:"Vector 的迭代器是线程安全的吗?"
标准回答:
- 不是。Vector 的
iterator()和listIterator()返回的迭代器不是线程安全的 - 迭代过程中修改会抛
ConcurrentModificationException - 需要用
Collections.synchronizedList()包装后,在同步块中遍历
面试官追问:"那你说什么场景下可以用 Vector?"
标准回答:
- 新代码:不推荐用,直接用 ArrayList
- 老代码:如果已经在用,可以继续用
- 简单工具类:不需要并发的地方,Vector 和 ArrayList 性能一样