JVM / Java / Collections / Queues
1. Queue Basics
Queue = Fist In, First Out
As analogy, imagine a line at supermarket.
First persion in line, first served.
New people join at the end.
Java provides two versions of the same operations
to handle failure differently (add or offer).
- if fails, add() throw exception, offer() return false
- if empty, remove() throws exception, poll() return null
- if empty, element() throws exception, peek() return null
Prefer offer(), poll(), peek().
They are safer and more commonly used.
import java.util.ArrayDeque;
import java.util.Queue;
public class QueueBasics {
public static void main(String[] args) {
Queue<String> queue = new ArrayDeque<>();
queue.offer("Alice");
queue.offer("Bob");
queue.offer("Charlie");
String first = queue.peek();
System.out.println("Next customer: " + first);
String served = queue.poll();
System.out.println("Served: " + served);
System.out.println("Queue after serving: " + queue);
queue.offer("Diana");
queue.offer("Eva");
System.out.println("Updated queue: " + queue);
while (!queue.isEmpty()) {
System.out.println("Serving: " + queue.poll());
}
}
}
2. Deque Example
Deque allows insertion and removal from BOTH ends.
This makes it more powerful than a Queue.
Better performance with ArrayDeque.
Use Deque for most cases (best performance).
package collections.queues;
import java.util.ArrayDeque;
import java.util.Deque;
public class DequeExample {
public static void main(String[] args) {
Deque<String> deque = new ArrayDeque<>();
deque.offerLast("Alice");
deque.offerLast("Bob");
deque.offerLast("Charlie");
System.out.println("Serve: " + deque.pollFirst());
deque.push("X");
deque.push("Y");
deque.push("Z");
System.out.println("Pop: " + deque.pop());
deque.addFirst("Start");
deque.addLast("End");
System.out.println(deque);
System.out.println("Remove first: " + deque.removeFirst());
System.out.println("Remove last: " + deque.removeLast());
System.out.println("Peek first: " + deque.peekFirst());
System.out.println("Peek last: " + deque.peekLast());
}
}