Java PriorityQueue Class



Introduction

The Java PriorityQueue class is an unbounded priority queue based on a priority heap. The elements are not based on their insertion order, but rather they are based on the priority of the elements.

The PriorityQueue depends on an array of objects, and this array is auto-resized if the capacity is not enough to store the elements. The PriorityQueue class takes O(logn) time for the operations of enqueuing and dequeuing methods in the PriorityQueue.

Java PriorityQueue Class

Characteristics

The following are the important points about PriorityQueue in Java −

  • The elements of the priority queue are ordered according to their natural ordering, or by a Comparator provided at queue construction time, depending on which constructor is used.
  • A priority queue does not permit null elements.
  • A priority queue relying on natural ordering also does not permit insertion of non-comparable objects.

Class Declaration

The following is the declaration for java.util.PriorityQueue class −

public class PriorityQueue<E>
   extends AbstractQueue<E>
   implements Serializable

Parameter

E − This is the type of elements held in this collection.

How to Implement the PriorityQueue Class?

The following are the steps to implement a PriorityQueue class in Java −

Step 1

In Java, to implement or use a PriorityQueue class, we first need to import the java.util.PriorityQueue or java.util.* package to use the PriorityQueue class.

import java.util.PriorityQueue
//OR
import java.util.*

Step 2

After importing the PriorityQueue class, we will instantiate the PriorityQueue and create its object named "pqueue".

PriorityQueue<Datatype> pqueue = new PriorityQueue<Datatype>();

Step 3

Now we operate on the PriorityQueue, above "Datatype" is the type of the object to be stored in the Queue. To add elements to the PriorityQueue class, we use either the add() or offer() methods.

PriorityQueue<Integer> pqueue = new PriorityQueue<Integer> ();
pqueue.add(20);
pqueue.offer(35);

Here, we have created a PriorityQueue of integers and, using the add() and offer() methods, we add "20" and "35" respectively to the PriorityQueue.

Example of PriorityQueue Class

Below is an example of the PriorityQueue class to show its basic operations in Java −

package com.tutorialspoint;

import java.util.PriorityQueue;

public class PriorityQueueDemo {
   public static void main(String[] args) {
      
      // create an empty priority queue with no initial capacity
      PriorityQueue<Integer> pqueue = new PriorityQueue<>();

      // use offer() method to add elements to the queue
      pqueue.offer(10);
      pqueue.offer(35);
      pqueue.offer(20);
      
      System.out.println("The head of the queue is: " + pqueue.peek());
      System.out.println("The removed element is: " + pqueue.poll());
      System.out.println("The queue is: " + pqueue);
      
    }
}

Output

Let us compile and run the above program. This will produce the following result −

The head of the queue is: 10
The removed element is: 10
The queue is: [20, 35]

Class Constructors

The following are the class constructors present in the PriorityQueue class −

Sr.No. Constructor & Description
1

PriorityQueue()

This creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering.

2

PriorityQueue(Collection<? extends E> c)

This creates a PriorityQueue containing the elements in the specified collection.

3

PriorityQueue(int initialCapacity)

This creates a PriorityQueue with the specified initial capacity that orders its elements according to their natural ordering.

4

PriorityQueue(int initialCapacity, Comparator<? super E> comparator)

This creates a PriorityQueue with the specified initial capacity that orders its elements according to the specified comparator.

5

PriorityQueue(PriorityQueue<? extends E> c)

This creates a PriorityQueue containing the elements in the specified priority queue.

6

PriorityQueue(SortedSet<? extends E> c)

This creates a PriorityQueue containing the elements in the specified sorted set.

Class Methods

The following are the supported methods in the PriorityQueue class −

Sr.No. Method & Description
1 boolean add(E e)

This method inserts the specified element into this priority queue.

2 void clear()

This method removes all of the elements from this priority queue.

3 Comparator<? super E> comparator()

This method returns the comparator used to order the elements in this queue, or null if this queue is sorted according to the natural ordering of its elements.

4 boolean contains(Object o)

This method returns true if this queue contains the specified element.

5 void forEach(Consumer<? super E> action)

This method performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception.

6 Iterator<E> iterator()

This method returns an iterator over the elements in this queue.

7 boolean offer(E e)

This method inserts the specified element into this priority queue.

8 boolean remove(Object o)

This method removes a single instance of the specified element from this queue, if it is present.

9 boolean removeAll(Collection<?> c)

This method removes all of this collection's elements that are also contained in the specified collection (optional operation).

10 boolean removeIf(Predicate<? super E> filter)

This method removes all of the elements of this collection that satisfy the given predicate.

11 boolean retainAll(Collection<?> c)

This method retains only the elements in this collection that are contained in the specified collection (optional operation).

12 Spliterator<E> spliterator()

This method creates a late-binding and fail-fast Spliterator over the elements in this queue.

13 <T> T[] toArray(T[] a)

This method returns an array containing all of the elements in this queue; the runtime type of the returned array is that of the specified array.

Methods inherited

This class inherits methods from the following classes in Java −

  • java.util.AbstractQueue
  • java.util.AbstractCollection
  • java.util.Object
  • java.util.Collection

Adding an Item to a PriorityQueue Example

The following example shows the usage of the Java PriorityQueue add(E) method to add Integers. We're adding a couple of Integers to the PriorityQueue object using the add() method calls per element, and then printing each element to show the elements added.

package com.tutorialspoint;

import java.util.PriorityQueue;

public class PriorityQueueDemo {
   public static void main(String[] args) {
      
      // create an empty priority queue with an initial capacity
      PriorityQueue<Integer> queue = new PriorityQueue<>(5);

      // use add() method to add elements in the queue
      queue.add(20);
      queue.add(30);
      queue.add(20);
      queue.add(30);
      queue.add(15);
      queue.add(22);
      queue.add(11);

      // let us print all the elements available in queue
      for (Integer number : queue) {
         System.out.println("Number = " + number);
      }
   }
}

Output

Let us compile and run the above program. This will produce the following result −

Number = 11
Number = 20
Number = 15
Number = 30
Number = 30
Number = 22
Number = 20

PriorityQueue using Custom Comparator

The PriorityQueue with a custom comparator allows us to define the ordering rule for the elements instead of depending upon the default natural ordering. Using the Comparator.reverseOrder(), we can make it work like a Max-Heap, where top priority is given to the highest value.

Example

Below is an example of the PriorityQueue class using the custom comparator in Java −

package com.tutorialspoint;

import java.util.PriorityQueue;
import java.util.Comparator;

public class PriorityQueueDemo {
   public static void main(String[] args) {

      // create an empty priority queue with a custom comparator
      PriorityQueue<Integer> queue = new PriorityQueue<>(5, Comparator.reverseOrder());

      // use add() method to add elements in the queue
      queue.add(20);
      queue.add(30);
      queue.add(20);
      queue.add(30);
      queue.add(15);
      queue.add(22);
      queue.add(11);

      // let us print all the elements available in queue
      for (Integer number : queue) {
         System.out.println("Number = " + number);
      }
   }
}

Output

Let us compile and run the above program. This will produce the following result −

Number = 30
Number = 30
Number = 22
Number = 20
Number = 15
Number = 20
Number = 11
Advertisements