Java中应避免使用过时的Stack类,改用ArrayDeque或LinkedList实现Deque接口;Queue接口优先选择ArrayDeque,因其性能最优;Deque可同时支持栈和队列操作,但建议语义统一以避免混淆。
Java里没有直接的 Stack 和 Queue 接口实现类能“开箱即用”——Stack 类已过时,Queue 是接口,必须选具体实现。别用 Stack,改用 Deque;队列优先选 ArrayDeque 或 LinkedList。
为什么不该用 java.util.Stack
Stack 继承自 Vector,是线程安全但性能差的遗留类,所有方法都加了 synchronized;它违背了“栈只应支持 LIFO 操作”的设计原则,还暴露了 Vector 的冗余方法(如 elementAt()、removeAllElements())。
替代方案:ArrayDeque(推荐)或 LinkedList,二者都实现了 Deque 接口,提供标准栈操作:
-
push(e)→ 入栈(等价于addFirst(e)) -
pop()→ 出栈(等价于removeFirst()),空时抛NoSuchElementException -
peek()→ 查看栈顶(等价于getFirst()),空时也抛异常
示例:
立即学习“Java免费学习笔记(深入)”;
Deque stack = new ArrayDeque(); stack.push(1); stack.push(2); System.out.println(stack.pop()); // 输出 2
Queue 接口该用哪个实现类
Queue 是接口,不能 new。常见实现有三个,适用场景不同:
-
ArrayDeque:非线程安全,基于循环数组,入队/出队均摊 O(1),无容量限制,**首选**(除非需要线程安全或延迟队列语义) -
LinkedList:也实现Queue,但底层是链表,内存开销略大,性能略逊于ArrayDeque;仅在需频繁插入/删除中间节点时才考虑 -
PriorityQueue:不是 FIFO,而是按优先级排序;若你想要“最小元素先出”,才用它;否则别选
注意:offer(e)(成功返回 true,失败如满队列返回 false)比 add(e)(失败直接抛 IllegalStateException)更安全;poll() 和 peek() 同理,比 remove()/element() 更健壮。