Queues power BFS, task scheduling, and rate limiting. Learn the three types of queues and when to use each.
A queue is a First In, First Out (FIFO) data structure. The first element added is the first one removed — like a line at a ticket counter.
import java.util.Queue;
import java.util.ArrayDeque;
Queue<Integer> queue = new ArrayDeque<>();
queue.offer(10); // enqueue — O(1)
queue.offer(20);
queue.offer(30);
queue.poll(); // dequeue — O(1), returns 10Always use ArrayDeque or LinkedList in Java, not an ArrayList for queues. ArrayList.remove(0) is O(n) because it shifts all elements. queue.poll() is O(1).
public List<Integer> bfs(Map<Integer, List<Integer>> graph, int start) {
Set<Integer> visited = new HashSet<>();
visited.add(start);
Queue<Integer> queue = new ArrayDeque<>();
queue.offer(start);
List<Integer> order = new ArrayList<>();
while (!queue.isEmpty()) {
int node = queue.poll();
order.add(node);
for (int neighbor : graph.getOrDefault(node, new ArrayList<>())) {
BFS visits nodes level by level — perfect for shortest path in unweighted graphs.
A deque supports O(1) add/remove from both ends.
import java.util.Deque;
import java.util.ArrayDeque;
Deque<Integer> dq = new ArrayDeque<>();
dq.offerLast(1); // add to right
dq.offerFirst(0); // add to left
dq.pollLast(); // remove from right
dq.pollFirst(); // remove from leftpublic int[] maxSlidingWindow(int[] arr, int k) {
Deque<Integer> dq = new ArrayDeque<>(); // stores indices, decreasing order of values
int[] result = new int[arr.length - k + 1];
int resIdx = 0;
for (int i = 0; i < arr.length; i++) {
// Remove elements outside window
while (!dq.isEmpty() && dq.peekFirst() < i - k + 1) {
dq.pollFirst();
}
A priority queue always dequeues the highest priority element first.
import java.util.PriorityQueue;
import java.util.Collections;
// Min heap (default in Java)
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(3);
pq.offer(1);
pq.offer(2);
pq.poll(); // returns 1 (smallest)
// Max heap — pass a custom comparator
PriorityQueue<Integer> maxPq = new PriorityQueue<>(Collections.reverseOrder());
maxPq.offer(3);
maxPq.offer(1);
maxPq.poll(); // returns 3 (largest)public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> count = new HashMap<>();
for (int n : nums) {
count.put(n, count.getOrDefault(n, 0) + 1);
}
// Min heap of size k
PriorityQueue<Integer> heap = new PriorityQueue<>(
(a, b) -> count.get(a) - count.get(b)
);
for (int num : count.keySet()) {
heap.offer
| Implementation | Enqueue | Dequeue | Use when |
|---|---|---|---|
ArrayDeque | O(1) amortized | O(1) amortized | General purpose BFS |
ArrayList | O(1) amortized | O(n) | Never for queues |
PriorityQueue | O(log n) | O(log n) | Priority-based processing |
ConcurrentLinkedQueue | O(1) | O(1) | Thread-safe multi-threading |
ArrayDeque in Java