Java 中的 PriorityBlockingQueue 类

原文:https://www . geeksforgeeks . org/priorityblockingqueue-class-in-Java/

优先级阻塞队列是一个无界阻塞队列,它使用与类 优先级队列 相同的排序规则,并提供阻塞检索操作。由于它是无界的,添加元素有时可能会因为资源耗尽而失败,导致 OutOfMemoryError 。此类不允许空元素。 PriorityBlockingQueue 类及其迭代器实现了 Collection 和 iterator 接口的所有可选方法。

方法中提供的迭代器()和方法中提供的拆分器()和不能保证以任何特定的顺序遍历优先级阻塞队列的元素。对于有序遍历,使用arrays . sort(pq . to array())。此外,方法 drainTo()可用于按优先级顺序移除一些或所有元素,并将它们放入另一个集合中。

对这个类的操作不能保证具有相同优先级的元素的顺序。如果需要强制排序,请定义自定义类或比较器,这些类或比较器使用辅助键来断开主优先级值的联系。 这个类是 Java 集合框架的成员。

优先等级封锁队列

Hierarchy of PriorityBlockingQueue Class in Java

它实现了可序列化可迭代< E >集合< E >阻塞队列< E >队列< E > 接口并扩展了抽象队列< E > 类。

申报:

公共类优先级阻塞队列扩展抽象队列实现阻塞队列,可序列化

这里, E 是这个集合中持有的元素类型。

优先级阻塞队列的构造函数

为了创建 PriorityBlockingQueue 的实例,我们需要从Java . util . concurrent . PriorityBlockingQueue导入。

1。PriorityBlockingQueue()–创建一个具有默认初始容量(11)的 PriorityBlockingQueue,根据元素的自然顺序对其进行排序。添加超过初始容量的元素会动态更改优先级阻塞队列的容量,因为优先级阻塞队列不受容量限制。

PriorityBlockingQueue pbq =新的 PriorityBlockingQueue();

例:

Java 语言(一种计算机语言,尤用于创建网站)

// Java program to demonstrate
// PriorityBlockingQueue() constructor

import java.util.concurrent.PriorityBlockingQueue;

public class GFG {

    public static void main(String[] args)
    {

        // create object of PriorityBlockingQueue
        // using PriorityBlockingQueue() constructor
        PriorityBlockingQueue<Integer> pbq
            = new PriorityBlockingQueue<Integer>();

        // add  numbers
        pbq.add(1);
        pbq.add(2);
        pbq.add(3);
        pbq.add(4);
        pbq.add(5);

        // print queue
        System.out.println("PriorityBlockingQueue:" + pbq);
    }
}

Output: 

PriorityBlockingQueue:[1, 2, 3, 4, 5]

2。优先级阻塞队列(集合<?扩展 E>c)–创建一个包含指定集合中元素的 PriorityBlockingQueue。

PriorityBlockingQueue pbq =新的 PriorityBlockingQueue(集合 extends E>c);

例:

Java 语言(一种计算机语言,尤用于创建网站)

// Java program to demonstrate
// PriorityBlockingQueue(Collection c) constructor

import java.util.concurrent.PriorityBlockingQueue;
import java.util.*;

public class GFG {

    public static void main(String[] args)
    {

        // Creating a Collection
        Vector<Integer> v = new Vector<Integer>();
        v.addElement(1);
        v.addElement(2);
        v.addElement(3);
        v.addElement(4);
        v.addElement(5);

        // create object of PriorityBlockingQueue
        // using PriorityBlockingQueue(Collection c)
        // constructor
        PriorityBlockingQueue<Integer> pbq
            = new PriorityBlockingQueue<Integer>(v);

        // print queue
        System.out.println("PriorityBlockingQueue:" + pbq);
    }
}

Output: 

PriorityBlockingQueue:[1, 2, 3, 4, 5]

3。PriorityBlockingQueue(int initial capacity)–创建具有指定初始容量的 PriorityBlockingQueue,该队列根据元素的自然顺序对其进行排序。

例:

Java 语言(一种计算机语言,尤用于创建网站)

// Java program to demonstrate
// PriorityBlockingQueue(int initialCapacity)
// constructor

import java.util.concurrent.PriorityBlockingQueue;

public class GFG {

    public static void main(String[] args)
    {
        // define capacity of PriorityBlockingQueue
        int capacity = 15;

        // create object of PriorityBlockingQueue
        // using PriorityBlockingQueue(int initialCapacity)
        // constructor
        PriorityBlockingQueue<Integer> pbq
            = new PriorityBlockingQueue<Integer>(capacity);

        // add  numbers
        pbq.add(1);
        pbq.add(2);
        pbq.add(3);

        // print queue
        System.out.println("PriorityBlockingQueue:" + pbq);
    }
}

Output: 

PriorityBlockingQueue:[1, 2, 3]

4。优先级阻塞队列(int initialCapacity,比较器<?super E >比较器)–创建具有指定初始容量的 PriorityBlockingQueue,该队列根据指定的比较器对其元素进行排序。

例:

Java 语言(一种计算机语言,尤用于创建网站)

// Java program to demonstrate
// PriorityBlockingQueue(int initialCapacity, Comparator
// comparator) constructor

import java.util.concurrent.PriorityBlockingQueue;
import java.util.*;

public class GFG {

    public static void main(String[] args)
    {
        // define capacity of PriorityBlockingQueue
        int capacity = 15;

        // create object of PriorityBlockingQueue
        PriorityBlockingQueue<Integer> pbq
            = new PriorityBlockingQueue<Integer>(
                capacity, Comparator.reverseOrder());

        // add  numbers
        pbq.add(1);
        pbq.add(2);
        pbq.add(3);

        // print queue
        System.out.println("PriorityBlockingQueue:" + pbq);
    }
}

Output: 

PriorityBlockingQueue:[3, 1, 2]

基本操作

1。添加元素

PriorityBlockingQueue 的 add(E e) 方法将作为参数传递的元素插入到这个 PriorityBlockingQueue 尾部的方法中。如果元素的添加成功,此方法返回 true。否则返回假。

Java 语言(一种计算机语言,尤用于创建网站)

// Java program to demonstrate adding elements
// to the PriorityBlockingQueue

import java.util.concurrent.PriorityBlockingQueue;

public class AddingElementsExample {

    public static void main(String[] args)
    {
        // define capacity of PriorityBlockingQueue
        int capacity = 15;

        // create object of PriorityBlockingQueue
        PriorityBlockingQueue<Integer> pbq
            = new PriorityBlockingQueue<Integer>(capacity);

        // add  numbers
        pbq.add(1);
        pbq.add(2);
        pbq.add(3);

        // print queue
        System.out.println("PriorityBlockingQueue:" + pbq);
    }
}

Output: 

PriorityBlockingQueue:[1, 2, 3]

2。拆卸元件

PriorityBlockingQueue 的 remove(Object o) 方法用于从该队列中删除一个元素。此方法移除作为参数传递的元素的单个实例(如果存在)。当且仅当元素被移除时,它返回 true,否则它返回 false。 clear() 用于一次性清除所有元素。

Java 语言(一种计算机语言,尤用于创建网站)

// Java program to demonstrate removing
// elements from the PriorityBlockingQueue

import java.util.concurrent.PriorityBlockingQueue;

public class RemovingElementsExample {

    public static void main(String[] args)
    {
        // define capacity of PriorityBlockingQueue
        int capacity = 15;

        // create object of PriorityBlockingQueue
        PriorityBlockingQueue<Integer> pbq
            = new PriorityBlockingQueue<Integer>(capacity);

        // add  numbers
        pbq.add(1);
        pbq.add(2);
        pbq.add(3);

        // print queue
        System.out.println("PriorityBlockingQueue:" + pbq);

        // remove all the elements
        pbq.clear();

        // print queue
        System.out.println("PriorityBlockingQueue:" + pbq);
    }
}

Output: 

PriorityBlockingQueue:[1, 2, 3]
PriorityBlockingQueue:[]

3。访问元素

PriorityBlockingQueue 的 peek() 方法返回 PriorityBlockingQueue 头部的元素。它检索 LinkedBlockingQueue 头的值,但不删除它。如果 PriorityBlockingQueue 不包含任何元素,则此方法返回 null。优先级阻塞队列使用与类优先级队列相同的排序规则。

Java 语言(一种计算机语言,尤用于创建网站)

// Java Program Demonstrate accessing
// elements of PriorityBlockingQueue

import java.util.concurrent.PriorityBlockingQueue;

public class AccessingElementsExample {
    public static void main(String[] args)
    {
        // define capacity of PriorityBlockingQueue
        int capacityOfQueue = 5;

        // create object of PriorityBlockingQueue
        PriorityBlockingQueue<Integer> PrioQueue
            = new PriorityBlockingQueue<Integer>(
                capacityOfQueue);

        // Add elements to PriorityBlockingQueue
        PrioQueue.add(464161);
        PrioQueue.add(416165);

        // print PrioQueue
        System.out.println("PrioQueue: " + PrioQueue);

        // get head of PriorityBlockingQueue
        int head = PrioQueue.peek();

        // print head of PriorityBlockingQueue
        System.out.println("Head of Queue: " + head);
    }
}

Output

PrioQueue: [416165, 464161]
Head of Queue: 416165

4。迭代

PriorityBlockingQueue 类的迭代器()方法返回这个队列中元素的迭代器。从该方法返回的元素不遵循任何顺序。返回的迭代器弱一致。

Java 语言(一种计算机语言,尤用于创建网站)

// Java Program Demonstrate iterating
// over PriorityBlockingQueue

import java.util.concurrent.PriorityBlockingQueue;
import java.util.*;

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

        // define capacity of PriorityBlockingQueue
        int capacityOfQueue = 5;

        // create object of PriorityBlockingQueue
        PriorityBlockingQueue<String> names
            = new PriorityBlockingQueue<String>(
                capacityOfQueue);

        // Add names of students of girls college
        names.add("Geeks");
        names.add("forGeeks");
        names.add("A");
        names.add("Computer");
        names.add("Portal");

        // Call iterator() method of PriorityBlockingQueue
        Iterator iteratorVals = names.iterator();

        // Print elements of iterator
        // created from PriorityBlockingQueue
        System.out.println("The Names are:");

        while (iteratorVals.hasNext()) {
            System.out.println(iteratorVals.next());
        }
    }
}

Output

The Names are:
A
Computer
Geeks
forGeeks
Portal

5。比较器示例

PriorityBlockingQueue 的比较器()方法返回可用于对 PriorityBlockingQueue 中的元素进行排序的比较器。如果队列遵循元素的自然排序模式,则方法返回空值。

Java 语言(一种计算机语言,尤用于创建网站)

// Java Program Demonstrate comparator()
// method and passing Comparator to PriorityBlockingQueue

import java.util.concurrent.PriorityBlockingQueue;
import java.util.*;

public class ComparatorExample {
    public static void main(String[] args)
        throws InterruptedException
    {

        // create object of PriorityBlockingQueue
        PriorityBlockingQueue<Integer> PrioQueue
            = new PriorityBlockingQueue<Integer>(
                10, new Comparator<Integer>() {
                    public int compare(Integer a, Integer b)
                    {
                        return a - b;
                    }
                });

        // Add numbers to PriorityBlockingQueue
        PrioQueue.put(45815616);
        PrioQueue.put(4981561);
        PrioQueue.put(4594591);
        PrioQueue.put(9459156);

        // get String representation of
        // PriorityBlockingQueue
        String str = PrioQueue.toString();

        // Creating a comparator using comparator()
        Comparator comp = PrioQueue.comparator();

        // Displaying the comparator values
        System.out.println("Comparator value: " + comp);

        if (comp == null)
            System.out.println(
                "PriorityBlockingQueue follows natural ordering");
        else
            System.out.println(
                "PriorityBlockingQueue follows : " + comp);
    }
}

Output

Comparator value: ComparatorExample$1@27bc2616
PriorityBlockingQueue follows : ComparatorExample$1@27bc2616

优先级阻塞队列的方法

| 方法 | 描述 | | --- | --- | | [加(E e)](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-add-method-in-java/&sa=U&ved=2ahUKEwi8_-Hh7YHsAhXGc94KHRvmB_YQFjAFegQIABAC&usg=AOvVaw2_M8LNnHV-BkHj8hw1qZiE) | 将指定的元素插入此优先级队列。 | | [晴()](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-clear-method-in-java/&sa=U&ved=2ahUKEwjTw86U7oHsAhU54XMBHY0_D7U4ChAWMAF6BAgJEAI&usg=AOvVaw1bdg89flKjV_5yftq07h6j) | 自动从该队列中移除所有元素。 | | [比较器()](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-comparator-method-in-java/&sa=U&ved=2ahUKEwjTw86U7oHsAhU54XMBHY0_D7U4ChAWMAB6BAgEEAI&usg=AOvVaw2AvWsT00z4rELtOZORp9V-) | 返回用于对该队列中的元素进行排序的比较器,如果该队列使用其元素的自然排序,则返回 null。 | | [包含(对象 o)](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-contains-method-in-java/&sa=U&ved=2ahUKEwi8_-Hh7YHsAhXGc94KHRvmB_YQFjAIegQIAxAB&usg=AOvVaw3qvVo2amW1K9RZ2KFMZm3L) | 如果此队列包含指定的元素,则返回 true。 | | [沥水图(收藏 c)](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-drainto-method-in-java/&sa=U&ved=2ahUKEwi8_-Hh7YHsAhXGc94KHRvmB_YQFjAGegQIAhAC&usg=AOvVaw1c90K2h0L_HqctZbghZcVE) | 从此队列中移除所有可用元素,并将它们添加到给定集合中。 | | [沥水图(收藏 c,int maxElements)](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-drainto-method-in-java/&sa=U&ved=2ahUKEwi8_-Hh7YHsAhXGc94KHRvmB_YQFjAGegQIAhAC&usg=AOvVaw1c90K2h0L_HqctZbghZcVE) | 从该队列中最多移除给定数量的可用元素,并将它们添加到给定集合中。 | | forEach(消费者 super E>行动) | 对 Iterable 的每个元素执行给定的操作,直到所有元素都被处理完或者该操作引发异常。 | | [迭代器()](https://www.geeksforgeeks.org/priorityblockingqueue-iterator-method-in-java/) | 返回该队列中元素的迭代器。 | | [报价(E e)](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-offer-method-in-java/&sa=U&ved=2ahUKEwjTw86U7oHsAhU54XMBHY0_D7U4ChAWMAJ6BAgHEAI&usg=AOvVaw1dMuJCK-vAValEmrXACQ5m) | 将指定的元素插入此优先级队列。 | | [报价(E e,长超时,时间单位单位)](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-offer-method-in-java/&sa=U&ved=2ahUKEwjTw86U7oHsAhU54XMBHY0_D7U4ChAWMAJ6BAgHEAI&usg=AOvVaw1dMuJCK-vAValEmrXACQ5m) | 将指定的元素插入此优先级队列。 | | [放(E e)](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-put-method-in-java/&sa=U&ved=2ahUKEwjTw86U7oHsAhU54XMBHY0_D7U4ChAWMAV6BAgGEAE&usg=AOvVaw3Ij4ttWny1VQ1xsOgtf2sk) | 将指定的元素插入此优先级队列。 | | [剩余容量()](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-remainingcapacity-method-in-java/&sa=U&ved=2ahUKEwjTw86U7oHsAhU54XMBHY0_D7U4ChAWMAN6BAgIEAI&usg=AOvVaw21mnqfPKe2Kk1Q_Keb63Dg) | 总是返回整数。最大值,因为优先级阻塞队列不受容量限制。 | | [移除(物体 o)](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-remove-method-in-java/&sa=U&ved=2ahUKEwi8_-Hh7YHsAhXGc94KHRvmB_YQFjAJegQIBRAC&usg=AOvVaw3nz4ab3WHgY97vFYkehDAk) | 从该队列中移除指定元素的单个实例(如果存在)。 | | 移除所有(集合> c) | 移除此集合中也包含在指定集合中的所有元素(可选操作)。 | | 移除 If(谓词 super E>过滤器) | 移除此集合中满足给定谓词的所有元素。 | | 零售(集合> c) | 仅保留此集合中包含在指定集合中的元素(可选操作)。 | | [分流器()](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-spliterator-method-in-java/&sa=U&ved=2ahUKEwjTw86U7oHsAhU54XMBHY0_D7U4ChAWMAR6BAgFEAI&usg=AOvVaw1om6Xdr33wSkHRL1tNyIMC) | 返回该队列中元素的拆分器。 | | [toaarray()](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-toarray-method-in-java/&sa=U&ved=2ahUKEwi8_-Hh7YHsAhXGc94KHRvmB_YQFjADegQIBxAC&usg=AOvVaw0GzQtc6JyMDZSEgoufIobn) | 返回包含该队列中所有元素的数组。 | | [toaarray(t[]a)](https://www.google.com/url?client=internal-element-cse&cx=009682134359037907028:tj6eafkv_be&q=https://www.geeksforgeeks.org/priorityblockingqueue-toarray-method-in-java/&sa=U&ved=2ahUKEwi8_-Hh7YHsAhXGc94KHRvmB_YQFjADegQIBxAC&usg=AOvVaw0GzQtc6JyMDZSEgoufIobn) | 返回包含该队列中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。 |

java.util.AbstractQueue 类中声明的方法

| 方法 | 描述 | | --- | --- | | [addAll(收藏 c)](https://www.geeksforgeeks.org/abstractqueue-addall-method-in-java-with-examples/) | 将指定集合中的所有元素添加到该队列中。 | | [元素()](https://www.geeksforgeeks.org/abstractqueue-element-method-in-java-with-examples/) | 检索但不移除该队列的头。 | | [移除()](https://www.geeksforgeeks.org/abstractqueue-remove-method-in-java-with-examples/#:~:text=The%20remove()%20method%20of,the%20head%20of%20this%20queue.&text=Parameters%3A%20This%20method%20does%20not,if%20the%20queue%20is%20empty.) | 检索并删除该队列的头。 |

java.util.AbstractCollection 类中声明的方法

| 方法 | 描述 | | --- | --- | | [包含所有(收藏 c)](https://www.geeksforgeeks.org/abstractcollection-containsall-method-in-java-with-examples/) | 如果此集合包含指定集合中的所有元素,则返回 true。 | | [【isempty()](https://www.geeksforgeeks.org/abstractcollection-isempty-method-in-java-with-examples/) | 如果此集合不包含元素,则返回 true。 | | [toString()](https://www.geeksforgeeks.org/abstractcollection-tostring-method-in-java-with-examples/) | 返回此集合的字符串表示形式。 |

接口 Java . util . concurrent . blockingqueue 中声明的方法

| 方法 | 描述 | | --- | --- | | [轮询(长超时,时间单位单位)](https://www.geeksforgeeks.org/blockingqueue-poll-method-in-java-with-examples/) | 检索并删除该队列的头,如果需要某个元素变得可用,则等待指定的等待时间。 | | [取()](https://www.geeksforgeeks.org/blockingqueue-take-method-in-java-with-examples/) | 检索并移除该队列的头,如有必要,等待直到某个元素变得可用。 |

接口 java.util.Collection 中声明的方法

| 方法 | 描述 | | --- | --- | | [addAll(收藏 c)](https://www.geeksforgeeks.org/collection-addall-method-in-java-with-examples/) | 将指定集合中的所有元素添加到此集合中(可选操作)。 | | 包含所有(集合> c) | 如果此集合包含指定集合中的所有元素,则返回 true。 | | 等于(对象 0) | 将指定的对象与此集合进行比较,看是否相等。 | | hashCode() | 返回此集合的哈希代码值。 | | isEmpty() | 如果此集合不包含元素,则返回 true。 | | 并行流() | 以此集合为源返回一个可能并行的流。 | | 大小() | 返回此集合中的元素数量。 | | 流() | 返回以此集合为源的顺序流。 | | toArray (IntFunction 生成器) | 使用提供的生成器函数分配返回的数组,返回包含此集合中所有元素的数组。 |

接口 java.util.Queue 中声明的方法

| 方法 | 描述 | | --- | --- | | [元素()](https://www.geeksforgeeks.org/queue-element-method-in-java/) | 检索但不移除该队列的头。 | | [peek()](https://www.geeksforgeeks.org/queue-peek-method-in-java/) | 检索但不移除该队列的头,如果该队列为空,则返回 null。 | | [投票()](https://www.geeksforgeeks.org/queue-poll-method-in-java/) | 检索并删除该队列的头,如果该队列为空,则返回 null。 | | [移除()](https://www.geeksforgeeks.org/queue-remove-method-in-java/#:~:text=The%20remove()%20method%20of,when%20the%20Queue%20is%20empty.&text=Returns%3A%20This%20method%20returns%20the%20head%20of%20the%20Queue.) | 检索并删除该队列的头。 |

参考:https://docs . Oracle . com/en/Java/javase/11/docs/API/Java . base/Java/util/concurrent/priorityblockingqueue . html