【java中优先队列】在Java编程语言中,优先队列(Priority Queue)是一种特殊的队列结构,它根据元素的优先级来决定出队顺序。与普通队列“先进先出”(FIFO)不同,优先队列中的元素按照其自然排序或自定义比较器进行排序,每次取出的是当前优先级最高的元素。
以下是对Java中优先队列的总结,结合常见用法和特性,以表格形式展示。
Java中优先队列总结
特性/功能 | 说明 |
类名 | `java.util.PriorityQueue` |
继承关系 | 实现了 `Queue` 接口,继承自 `AbstractQueue` |
数据结构 | 基于堆(heap)实现,默认是小顶堆 |
默认排序 | 根据元素的自然顺序(如整数从小到大) |
自定义排序 | 可通过构造函数传入 `Comparator` 对象 |
是否允许 null 元素 | 不允许,抛出 `NullPointerException` |
是否线程安全 | 否,需手动同步或使用 `ConcurrentLinkedQueue` 等线程安全队列 |
常用方法 | `offer(E e)`、`poll()`、`peek()`、`remove()`、`contains()` 等 |
应用场景 | 图算法(如Dijkstra)、任务调度、事件处理等 |
示例代码
```java
import java.util.PriorityQueue;
public class PriorityQueueExample {
public static void main(String[] args) {
// 创建一个优先队列,默认按自然顺序排序(升序)
PriorityQueue
pq.offer(5);
pq.offer(2);
pq.offer(8);
System.out.println("队列中的元素:");
while (!pq.isEmpty()) {
System.out.print(pq.poll() + " ");
}
// 输出:2 5 8
}
}
```
自定义排序示例
```java
import java.util.Comparator;
import java.util.PriorityQueue;
public class CustomPriorityQueueExample {
public static void main(String[] args) {
// 使用自定义比较器,按降序排列
PriorityQueue
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1); // 降序
}
});
pq.offer("Apple");
pq.offer("Banana");
pq.offer("Cherry");
System.out.println("队列中的元素(降序):");
while (!pq.isEmpty()) {
System.out.print(pq.poll() + " ");
}
// 输出:Cherry Banana Apple
}
}
```
总结
Java中的优先队列是一个非常实用的数据结构,适用于需要动态维护元素优先级的场景。它基于堆实现,提供了高效的插入和删除操作。虽然它不是线程安全的,但在大多数单线程应用中表现良好。合理使用优先队列可以提升程序效率和可读性。