Part 4 队列 Queue
约 466 字大约 2 分钟
2025-05-21
在数据结构中我们学过,队列其实就是一个尾进首出、先进先出的链表。
在 Java 中,实现了Queue
接口的容器有 LinkedList 和 PriorityQueue。
而由于 LinkedList 基于双向链表实现,天然可作为队列使用。我们在 LinkedList 中介绍了其用法,在此不再赘述。
优先级队列 PriorityQueue 与通常意义上“先进先出”的队列不同,PriorityQueue 在插入元素时会自动按照优先级排序,优先级高的排前,优先级低的排后。当你从 PriorityQueue 中删除一个元素时,会自动将优先级最高的元素出队。
1 PriorityQueue 基本使用
1.1 创建一个 PriorityQueue
在使用 PriorityQueue 之前,需要先导入:
import java.util.PriorityQueue;
然后使用泛型声明一个 PriorityQueue。
PriorityQueue<String> pq = new PriorityQueue<>();
1.2 添加元素
使用.add()
方法向 PriorityQueue 中添加元素。
pq.add("Java");
pq.add("Python");
pq.add("C++");
pq.add("TypeScript");
System.out.println(pq.toString()); // [C++, Python, Java, TypeScript]
可以看到,元素排序与插入顺序无关,而是按照首字母排序。
1.2 访问队首元素
使用.peek()
方法访问队首元素。.peek()
并不会使元素出队。
System.out.println(pq.toString()); // [C++, Python, Java, TypeScript]
System.out.println((pq.peek())); // C++
1.3 元素出队
使用.poll()
方法使队首元素出队,并返回被出队的元素。
System.out.println(pq.toString()); // [C++, Python, Java, TypeScript]
System.out.println(pq.poll()); // C++
System.out.println(pq.toString()); // [Java, Python, TypeScript]
1.4 更改排序规则
PriorityQueue 默认使用小顶堆排序,即按自然顺序从小到大排序。
要按照自然顺序从大到小排序,只需要在声明 PriorityQueue 时向构造函数传入Collections.reverseOrder()
作为比较器 即可。
当然在此之前,需要先导入Collections
。
import java.util.Collections;
PriorityQueue<String> pq = new PriorityQueue<>(Collections.reverseOrder());
pq.add("Java");
pq.add("Python");
pq.add("C++");
pq.add("TypeScript");
System.out.println(pq.toString()); // [TypeScript, Python, C++, Java]