Deque (Double-Ended Queue) 接口继承自 Queue 接口。它提供了一个双向功能,允许在队列的两端进行添加和移除操作。

操作目的 作为 LIFO 栈 (Stack) 作为 FIFO 队列 (Queue) 抛出异常 (严格) 返回特殊值 (健壮)
添加元素 头部添加 尾部添加 addFirst(), push(), add() offerFirst(), offerLast(), offer()
栈方法 push(E e) N/A push() N/A
入队方法 N/A add(E e) add() offer(E e)
移除元素 头部移除 头部移除 removeFirst(), pop(), remove() pollFirst(), poll()
出栈方法 pop() N/A pop() N/A
出队方法 N/A remove(), poll() remove() poll()
查看元素 查看头部元素 查看头部元素 getFirst(), element() peekFirst(), peek()
栈方法 N/A N/A getFirst() peekFirst()
队头方法 N/A element(), peek() element() peek()
List.of:创建一个不可变的(immutable)List。
不可变性 (Immutability):
List<String> newList = List.of("Apple", "Banana", "Cherry");

Queue 接口定义了标准的、线性的数据结构——队列 (Queue)

操作目的 方法(抛出异常) 方法(返回特殊值) 描述
添加/入队 add(E e) offer(E e) 将元素添加到队尾。
移除/出队 remove() poll() 移除并返回队头元素。
查看队头 element() peek() 返回队头元素,但不移除。

现代 Java 的首选:ArrayDeque

绝大多数情况下,如果你只是需要一个 Deque (或者一个 Queue 队列,或一个 Stack 栈),ArrayDeque 是你的首选

ArrayDeque (在 Java 6 引入) 是一个“数组双端队列”。

经典的(但通常较慢的)选择:LinkedList

LinkedList (你之前问过的) 是一个“链表”。


💡 如何选择:一个简单的规则

  1. 我需要一个Deque (双端队列) 或 Queue (队列) 吗?

    • 👉 使用 ArrayDeque

    • Deque<String> myQueue = new ArrayDeque<>();

  2. 我需要一个 Stack (栈) 吗?

    • (Java 有一个旧的 Stack 类,但官方不推荐使用它)。

    • 👉 使用 ArrayDequeDeque 接口提供了 push()pop() 方法,完美地实现了栈。

    • Deque<String> myStack = new ArrayDeque<>();

  3. 我需要一个 List (列表) 吗?

    • 👉 使用 ArrayList (如果你需要快速的 get(index) 访问)。

    • 👉 使用 LinkedList (如果你需要非常频繁地在列表_中间_ 插入/删除)。

总结:

LinkedList 试图同时做好 ListDeque 两件事,但 ArrayDeque 是一个专门为 DequeStack 操作优化的类