Q&A
What is the Java Queue interface?
Overview
Queue represents a "waiting line" - add to the tail, remove from the head (FIFO), or by priority. It extends Collection and is itself extended by Deque (double-ended queue) and BlockingQueue (concurrent). Choosing the right Queue implementation is a common systems and algorithms question.
graph TD
A["Queue<E> interface"] --> B[LinkedList: general-purpose FIFO]
A --> C[ArrayDeque: faster array-backed FIFO]
A --> D[PriorityQueue: sorted by priority]
A --> E[BlockingQueue: thread-safe, concurrent]
A --> F[Deque: double-ended, extends Queue]
style A fill:#1e1b4b,color:#fff
The Two Method Families
Every core Queue operation has two versions:
| Operation | Throws on failure | Returns null/false |
|---|---|---|
| Insert | add(e) |
offer(e) |
| Remove head | remove() |
poll() |
| Examine head | element() |
peek() |
- Throw versions (
add,remove,element) raise exceptions when the queue is full or empty. - Return versions (
offer,poll,peek) returnfalse/null- safer for bounded queues and when empty is a normal condition.
Prefer offer/poll/peek in general code.
Common Implementations
LinkedList - general-purpose FIFO
Queue<String> q = new LinkedList<>();
q.offer("first");
q.offer("second");
q.offer("third");
q.peek(); // "first" (head, not removed)
q.poll(); // "first" (head, removed)
q.poll(); // "second"
LinkedList implements both Queue and Deque, so it supports both ends, but for pure FIFO ArrayDeque is preferred.
ArrayDeque - faster, no null allowed
Queue<Integer> q = new ArrayDeque<>();
q.offer(1);
q.offer(2);
System.out.println(q.poll()); // 1
ArrayDeque is generally faster than LinkedList for queue use (better cache locality, no node allocation per element).
PriorityQueue - sorted by natural order or Comparator
Queue<Integer> pq = new PriorityQueue<>(); // min-heap by default
pq.offer(5); pq.offer(1); pq.offer(3);
pq.poll(); // 1 (smallest element)
pq.poll(); // 3
// Custom order: max-heap
Queue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
maxHeap.offer(5); maxHeap.offer(1); maxHeap.offer(3);
maxHeap.poll(); // 5
PriorityQueue does NOT guarantee FIFO among elements of equal priority - it's a heap, not stable.
Deque - Double-Ended Queue
Deque<E> extends Queue and allows insertion/removal at both ends. Use it as a stack (push/pop) or a strict FIFO queue (offer/poll from one end only):
Deque<String> deque = new ArrayDeque<>();
deque.offerFirst("front"); // add to front
deque.offerLast("back"); // add to back
deque.pollFirst(); // remove from front
deque.pollLast(); // remove from back
BlockingQueue - concurrent queues
For multi-threaded producer-consumer scenarios, java.util.concurrent.BlockingQueue adds blocking operations (put/take) that wait when the queue is full/empty. Implementations: LinkedBlockingQueue, ArrayBlockingQueue, PriorityBlockingQueue, SynchronousQueue.
Choosing an Implementation
| Need | Use |
|---|---|
| Simple FIFO | ArrayDeque |
| Priority ordering | PriorityQueue |
| Both ends / stack | ArrayDeque as Deque |
| Thread-safe FIFO | LinkedBlockingQueue |
| Thread-safe priority | PriorityBlockingQueue |
Why This Matters in Interviews
Java algorithms and system-design interviews use Queue constantly. Know the two method families (offer/poll/peek vs add/remove/element), the implementations (ArrayDeque for FIFO, PriorityQueue for heap/sorted), the Deque extension, and BlockingQueue for concurrency. Explaining why ArrayDeque beats LinkedList for FIFO (no node allocation, better cache locality) is a strong detail. PriorityQueue as a min-heap and the Comparator.reverseOrder() trick for max-heap is a common algorithm follow-up.
Common Pitfalls
- Calling
remove()/element()on an empty queue throwsNoSuchElementException- usepoll()/peek()instead. - Expecting
PriorityQueueto be FIFO (it's not - it's a heap). LinkedListallowingnull;ArrayDequeand most concurrent queues do not.- Using
Stack(legacy, synchronized) instead ofArrayDequeasDeque. - Sorting on removal expecting FIFO for equal-priority items in
PriorityQueue.
References
- Java
QueueAPI: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Queue.html - Java Collections tutorial: https://docs.oracle.com/javase/tutorial/collections/interfaces/queue.html