Java Queue Interface Tutorial 🎯

beginner
23 min

Java Queue Interface Tutorial 🎯

Welcome to our deep dive into the Java Queue Interface! In this tutorial, we'll explore what a Queue is, why we use it, and learn how to work with Queues in Java. By the end, you'll be able to implement and manage Queues in your own projects. Let's get started!

Understanding Queues 📝

A Queue is a data structure that follows the First-In-First-Out (FIFO) principle. This means that the first element that is added to the Queue is the first one to be removed. Queues are essential in many real-world applications, such as managing tasks in operating systems, handling network requests, and processing jobs in a printing shop.

Java's Queue Interface 💡

Java provides a built-in Queue interface within the java.util package. This interface defines a general-purpose Queue that can hold any type of objects. To use the Queue interface, we need to import the necessary classes:

java
import java.util.Queue; import java.util.Deque; import java.util.ArrayDeque;

The Deque (Double Ended Queue) interface extends the Queue interface and allows insertions and deletions at both ends. The ArrayDeque is the most common implementation of the Deque interface.

Creating and Using a Queue ✅

Now that we know what Queue is and its benefits, let's create and use a Queue in our Java code:

java
Queue<String> queue = new ArrayDeque<>(); // Adding elements to the Queue queue.add("Task 1"); queue.add("Task 2"); queue.add("Task 3"); // Displaying the Queue System.out.println("Initial Queue: " + queue); // Removing elements from the Queue queue.poll(); System.out.println("After removing a task: " + queue);

Output:

Initial Queue: [Task 1, Task 2, Task 3] After removing a task: [Task 2, Task 3]

More Queue Operations 💡

In addition to adding and removing elements, Queue provides several other useful operations:

  • peek(): Retrieve the head of the Queue without removing it
  • size(): Get the size of the Queue
  • isEmpty(): Check if the Queue is empty

Here's an example demonstrating these operations:

java
Queue<String> queue = new ArrayDeque<>(); // Adding elements to the Queue queue.add("Task 1"); queue.add("Task 2"); queue.add("Task 3"); // Displaying the Queue System.out.println("Initial Queue: " + queue); // Peeking at the head of the Queue System.out.println("Peek: " + queue.peek()); // Checking if the Queue is empty System.out.println("Is the Queue empty? " + queue.isEmpty()); // Removing elements from the Queue queue.poll(); System.out.println("After removing a task: " + queue);

Output:

Initial Queue: [Task 1, Task 2, Task 3] Peek: Task 1 Is the Queue empty? false After removing a task: [Task 2, Task 3]

Advanced Queue Examples 💡

To further demonstrate the power of Queues, let's build a simple print shop simulation. In this example, we'll use a Queue to manage the print jobs and a Thread to simulate the printing process:

java
import java.util.Queue; import java.util.LinkedList; import java.util.concurrent.TimeUnit; public class PrintShop { Queue<String> printQueue = new LinkedList<>(); boolean isPrinterAvailable = true; public void addJob(String job) { printQueue.add(job); System.out.println("Adding job: " + job); } public String getNextJob() { if (printQueue.isEmpty()) { System.out.println("No more jobs to print."); return null; } return printQueue.poll(); } public void printJob(String job) { if (!isPrinterAvailable) { System.out.println("Printer is busy. Adding job to the queue."); printQueue.add(job); return; } isPrinterAvailable = false; System.out.println("Printing job: " + job); try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); } isPrinterAvailable = true; System.out.println("Job: " + job + " printed."); } public static void main(String[] args) { PrintShop printShop = new PrintShop(); Thread printerThread = new Thread(new Runnable() { @Override public void run() { while (true) { String job = printShop.getNextJob(); if (job != null) { printShop.printJob(job); } } } }); printerThread.start(); printShop.addJob("Job 1"); printShop.addJob("Job 2"); printShop.addJob("Job 3"); } }

Output:

Adding job: Job 1 Adding job: Job 2 Adding job: Job 3 Printing job: Job 1 Printer is busy. Adding job to the queue. Adding job: Job 2 Printing job: Job 2 Job: Job 2 printed. Printer is busy. Adding job to the queue. Adding job: Job 3 Printing job: Job 3 Job: Job 3 printed. No more jobs to print.

In this example, we create a PrintShop class with a Queue to manage the print jobs. The Thread simulates the printer, and the program runs the simulation by adding jobs to the Queue and starting the printer thread.

That's it for this tutorial! You now have a strong understanding of Java Queue Interface and can implement Queues in your own projects. Keep practicing and exploring different data structures to enhance your coding skills! 🚀

Happy Coding! 🤖