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。