java中用arraydeque统一实现栈和队列:栈操作用push/pop/peek(尾部),队列操作用offer/poll/peek(头出尾进);优先arraydeque而非linkedlist或stack,避免混用两端。

Java 中用 Deque 同时实现栈和队列,关键在于**统一用 ArrayDeque 实例,再按需选择操作端点**——不用换类、不依赖过时的 Stack,API 清晰且性能好。
当作栈(LIFO):只操作尾部(推荐)
虽然双端队列两端都能用,但官方实践和多数教材都约定:用尾部(Last 端)模拟栈,语义更自然,也避免与队列逻辑混淆。
-
入栈:用
push(e)(等价于addLast(e)) -
出栈:用
pop()(等价于removeLast()),空时抛NoSuchElementException;更安全可选pollLast()(空时返回null) -
查看栈顶:用
peek()(等价于peekLast())
当作队列(FIFO):头出尾进
这是最标准的队列行为,完全兼容 Queue 接口语义,可直接把 Deque 当作 Queue 使用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
入队:用
offer(e)或add(e)(二者都等价于offerLast(e)) -
出队:用
poll()(等价于pollFirst()),空时返回null;或remove()(等价于removeFirst()),空时抛异常 -
查看队首:用
peek()(等价于peekFirst())
为什么优先选 ArrayDeque 而不是 LinkedList?
ArrayDeque 是基于循环数组的实现,比 LinkedList 更省内存、缓存更友好、随机访问更快;它不支持 null 元素,这点反而能提前暴露空值问题。除非你需要在中间频繁增删(这已超出栈/队列场景),否则没理由选 LinkedList。
- 正确写法:
Deque<string> stack = new ArrayDeque();</string> - 错误写法:
Deque<string> dq = new Deque();</string>(接口不能直接实例化) - 不推荐:
new Stack()(已废弃,非线程安全,API 设计陈旧)
别混用两端,也别随意切换模式
同一个 Deque 实例不要一会儿当栈(push/pop),一会儿又从头部插入(addFirst),容易逻辑混乱、难维护。明确用途后,坚持一套端点约定:
- 纯栈逻辑 → 始终用
push/pop/peek - 纯队列逻辑 → 始终用
offer/poll/peek - 需要双端操作(如滑动窗口、回文检测)→ 显式使用
addFirst/pollLast等,不套用栈/队列别名
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










