arraylist vs linkedlist vs vector vs stack:面试必问的Java集合对比
大家好!今天我们来聊聊面试中高频出现的Java集合问题:ArrayList vs LinkedList vs Vector vs Stack。这些都是Java基础中的基础,但你真的理解它们的区别吗?看完这篇,下次面试官问起,你就能对答如流了!

2025年Java面试宝典:
🔗 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g (建议保存备用)
🔍 底层数据结构决定了性能
-
ArrayList:动态数组实现。
随机访问快(O(1)),但中间插入/删除需要移动元素(O(n))。
ArrayList适合读多写少的场景。 -
LinkedList:双向链表实现。
插入/删除快(O(1)),但随机访问慢(O(n))。
LinkedList适合频繁增删的场景。 -
Vector:线程安全的动态数组(方法用synchronized修饰)。
性能比ArrayList差,现在基本被Collections.synchronizedList()替代。 -
Stack:继承自Vector,用数组实现栈结构(LIFO)。
由于设计问题,官方推荐用Deque替代。
⚙️ 扩容机制对比
| 类 | 扩容规则 |
|-------------|----------------------------------|
| ArrayList | 默认扩为1.5倍(int newCapacity = oldCapacity + (oldCapacity >> 1) |
| Vector | 默认扩为2倍(可通过构造器自定义) |
| LinkedList| 无扩容概念(链表动态添加节点) |
| Stack | 同Vector(继承其扩容逻辑) |
💡 面试题:ArrayList扩容代码怎么写?
答:Arrays.copyOf(elementData, newCapacity)复制旧数组到新数组。
🔒 线程安全谁负责?
- Vector/Stack:所有方法加锁(synchronized),保证线程安全但性能低
- ArrayList/LinkedList:非线程安全,需手动同步
// 正确用法 List<String> syncList = Collections.synchronizedList(new ArrayList<>());

❓ 高频面试题解析
Q:ArrayList和LinkedList遍历哪个快?
A:
- 随机访问:ArrayList碾压LinkedList(数组O(1) vs 链表O(n))
- 顺序访问:两者差异不大(迭代器模式下LinkedList略慢)
Q:为什么Stack被弃用?
A:
- 继承自Vector导致锁粒度粗
- 不符合栈的抽象设计(应限制为仅栈操作)
- 官方推荐:
Deque<Integer> stack = new ArrayDeque<>()
Q:Vector还有存在价值吗?
A:基本没有!用CopyOnWriteArrayList或Collections.synchronizedList替代更灵活。
💡 实战选型建议
| 场景 | 推荐类 |
|---------------------|---------------------|
| 高频查询+少增删 | ArrayList |
| 频繁增删+少随机访问 | LinkedList |
| 线程安全列表 | CopyOnWriteArrayList |
| 栈操作 | ArrayDeque |
⚠️ 注意:Vector和Stack在新项目中应避免使用!
🎁 最后的小福利
如果大家准备面试需要开通面试鸭会员,可以👉 通过面试鸭返利网找我 👈,能返利25元!用更低成本获取题库资源~

ArrayList、LinkedList、Vector、Stack的对比就到这里。记住核心:ArrayList靠数组随机访问快,LinkedList靠链表增删快,Vector是线程安全但过时,Stack该用Deque替代。理解底层逻辑,面试再也不慌!
(本文由面试鸭返利网提供技术支持)


