Java Queue Interface

Introduction

The Queue interface in Java, part of the java.util package, which represents a collection designed to hold elements prior to processing. 

It follows a first-in, first-out (FIFO) principle, though other types of ordering are possible depending on the implementation. 

Common implementations include LinkedList, PriorityQueue, and ArrayDeque.

Table of Contents

  1. What is the Queue Interface?
  2. Common Methods
  3. Examples of Using the Queue Interface
  4. Conclusion

1. What is the Queue Interface?

The Queue interface provides a way to manage collections of elements with the intent of processing them in a specific order. It is typically used to model scenarios like task scheduling and order processing. The Queue interface extends the Collection interface, adding methods to insert, remove, and inspect elements.

2. Common Methods

  • add(E e): Inserts the specified element into the queue, returning true if successful, and throwing an exception if the queue is full.
  • offer(E e): Inserts the specified element into the queue, returning true if successful, or false if the queue is full.
  • remove(): Retrieves and removes the head of the queue, throwing an exception if the queue is empty.
  • poll(): Retrieves and removes the head of the queue, or returns null if the queue is empty.
  • element(): Retrieves, but does not remove, the head of the queue, throwing an exception if the queue is empty.
  • peek(): Retrieves, but does not remove, the head of the queue, or returns null if the queue is empty.

3. Examples of Using the Queue Interface

Example 1: Basic Usage of Queue with LinkedList

This example demonstrates how to use a Queue with a LinkedList implementation.

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        // Adding elements to the queue
        queue.add("A");
        queue.add("B");
        queue.add("C");

        // Inspecting the head of the queue
        System.out.println("Head of the queue: " + queue.peek());

        // Removing elements from the queue
        while (!queue.isEmpty()) {
            System.out.println("Removed: " + queue.poll());
        }
    }
}

Output:

Head of the queue: A
Removed: A
Removed: B
Removed: C

Example 2: Using PriorityQueue

This example shows how to use a PriorityQueue to process elements based on their natural ordering.

import java.util.PriorityQueue;
import java.util.Queue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        Queue<Integer> queue = new PriorityQueue<>();

        // Adding elements to the queue
        queue.add(10);
        queue.add(20);
        queue.add(15);

        // Inspecting the head of the queue
        System.out.println("Head of the queue: " + queue.peek());

        // Removing elements from the queue
        while (!queue.isEmpty()) {
            System.out.println("Removed: " + queue.poll());
        }
    }
}

Output:

Head of the queue: 10
Removed: 10
Removed: 15
Removed: 20

Example 3: Using ArrayDeque

This example demonstrates how to use an ArrayDeque as a Queue.

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

public class ArrayDequeExample {
    public static void main(String[] args) {
        Queue<String> queue = new ArrayDeque<>();

        // Adding elements to the queue
        queue.offer("X");
        queue.offer("Y");
        queue.offer("Z");

        // Inspecting the head of the queue
        System.out.println("Head of the queue: " + queue.peek());

        // Removing elements from the queue
        while (!queue.isEmpty()) {
            System.out.println("Removed: " + queue.poll());
        }
    }
}

Output:

Head of the queue: X
Removed: X
Removed: Y
Removed: Z

Example 4: Handling Full Queues with offer

This example demonstrates how to handle a full queue scenario with the offer method.

import java.util.LinkedList;
import java.util.Queue;

public class QueueOfferExample {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();

        // Adding elements to the queue
        for (int i = 0; i < 5; i++) {
            if (queue.offer(i)) {
                System.out.println("Added: " + i);
            } else {
                System.out.println("Queue is full, couldn't add: " + i);
            }
        }

        // Inspecting the head of the queue
        System.out.println("Head of the queue: " + queue.peek());

        // Removing elements from the queue
        while (!queue.isEmpty()) {
            System.out.println("Removed: " + queue.poll());
        }
    }
}

Output:

Added: 0
Added: 1
Added: 2
Added: 3
Added: 4
Head of the queue: 0
Removed: 0
Removed: 1
Removed: 2
Removed: 3
Removed: 4

Example 5: Handling Empty Queues with poll

This example shows how to safely handle attempts to remove elements from an empty queue using poll.

import java.util.LinkedList;
import java.util.Queue;

public class QueuePollExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        // Attempting to remove elements from an empty queue
        String head = queue.poll();
        if (head == null) {
            System.out.println("Queue is empty, nothing to remove.");
        } else {
            System.out.println("Removed: " + head);
        }

        // Adding an element and then removing it
        queue.offer("Test");
        System.out.println("Removed: " + queue.poll());

        // Checking the queue is empty again
        head = queue.poll();
        if (head == null) {
            System.out.println("Queue is empty, nothing to remove.");
        } else {
            System.out.println("Removed: " + head);
        }
    }
}

Output:

Queue is empty, nothing to remove.
Removed: Test
Queue is empty, nothing to remove.

4. Conclusion

The Queue interface in Java provides a way to manage collections of elements with the intent of processing them in a specific order, typically FIFO. Various implementations of the Queue interface, such as LinkedList, PriorityQueue, and ArrayDeque, offer different performance characteristics and ordering strategies. 

Comments