Java中的PriorityBlockingQueue contains()方法

Java中的PriorityBlockingQueue contains()方法

PriorityBlockingQueue是Java中的一个非常常用的线程安全的队列,它支持优先级,能够自动进行排序。在操作PriorityBlockingQueue时,经常需要判断队列中是否包含某个元素,这时就需要用到contains()方法。

PriorityBlockingQueue简介

PriorityBlockingQueue是Java中的一个线程安全的队列,实现了BlockingQueue接口,它支持优先级排序,因此它不仅可以用作普通队列,还可以用作优先队列。PriorityBlockingQueue是无界的,当元素数量超过容量时,它会自动扩容。PriorityBlockingQueue的内部实现是基于堆的数据结构。

PriorityBlockingQueue实现了以下方法:

  • add(E e): 如果 PriorityBlockingQueue 中有空闲空间,则插入元素 e ,并返回 true。
  • offer(E e): 如果 PriorityBlockingQueue 中有空闲空间,则插入元素 e ,并返回 true。
  • put(E e): 向 PriorityBlockingQueue 中插入元素 e,如果 PriorityBlockingQueue 满了,则会阻塞,直到 PriorityBlockingQueue 中有空闲空间。
  • poll(): 取出并移除队列中的第一个元素,若队列为空,则返回 null。
  • remove(Object o): 如果队列中存在元素 o,则移除该元素并返回 true,否则返回 false。
  • isEmpty(): 判断 PriorityBlockingQueue 是否为空。
  • peek(): 查看 PriorityBlockingQueue 中的第一个元素,但不移除该元素。
  • clear(): 清空 PriorityBlockingQueue 中的所有元素。
  • contains(Object o): 判断 PriorityBlockingQueue 中是否包含指定元素。

PriorityBlockingQueue contains()方法说明

contains(Object o) 方法用于判断 PriorityBlockingQueue 中是否包含指定元素。在 PriorityBlockingQueue 中,元素的相等性判断是通过元素的 equals() 方法实现的,因此当判断元素是否相等时,需要保证元素类实现了 equals() 方法。

代码示例:

import java.util.concurrent.PriorityBlockingQueue;

public class PriorityBlockingQueueContainsExample {

    public static void main(String[] args) {
        PriorityBlockingQueue<String> priorityQueue = new PriorityBlockingQueue<>();

        priorityQueue.add("element1");
        priorityQueue.add("element2");
        priorityQueue.add("element3");

        boolean containsElement1 = priorityQueue.contains("element1");
        boolean containsElement4 = priorityQueue.contains("element4");

        System.out.println("containsElement1: " + containsElement1);
        System.out.println("containsElement4: " + containsElement4);
    }
}

输出结果为:

containsElement1: true
containsElement4: false

PriorityBlockingQueue contains()方法源码分析

contains(Object o) 方法调用了 PriorityQueue 的 contains(Object o) 方法,只不过 PriorityBlockingQueue 内部维护了一个 PriorityQueue。

PriorityQueue 的 contains(Object o) 方法的源码如下:

public boolean contains(Object o) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        return indexOf(o) != -1;
    } finally {
        lock.unlock();
    }
}

contains(Object o) 方法首先获取了 PriorityBlockingQueue 内部的锁,然后调用了 indexOf(Object o) 方法查找元素在队列中的下标,如果元素存在,则返回 true,否则返回 false。

indexOf(Object o) 方法源码如下:

private int indexOf(Object o) {
    if (o != null) {
        final Object[] es = queue;
        for (int i = 0, n = size; i < n; i++)
            if (o.equals(es[i]))
                return i;
    }
    return -1;
}

indexOf(Object o) 方法首先判断元素 o 是否为 null,如果不为 null,则循环遍历 PriorityBlockingQueue 中的所有元素,调用元素的 equals(Object o) 方法进行相等性判断,如果相等,则返回元素在队列中的下标。

结论

PriorityBlockingQueue 的 contains(Object o) 方法用于判断队列中是否包含某个元素,它的底层实现是基于 PriorityQueue 的 contains(Object o) 方法。元素的相等性判断是通过元素的 equals() 方法实现的,因此在使用 contains(Object o) 方法时,需要保证元素类实现了 equals() 方法。

如果元素数量不是很大,建议使用 HashSet 来判断元素是否存在,因为 HashSet 的 contains(Object o) 方法的时间复杂度为 O(1),而 PriorityBlockingQueue 的 contains(Object o) 方法的时间复杂度为 O(n)。但如果需要保持队列元素的优先级排序,则必须使用 PriorityBlockingQueue。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程