Queue 用于模拟队列这种数据结构,队列通常是指 "先进先出"(FIFO)的容器。队列的头部保存在队列 中存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素
Queue 接口的方法
Queue 接口有一个 PriorityQueue 实现类。除此之外,Queue 还有一个 Deque 接口,Deque 代表一个 "双端队列",双端队列可以同时从两端删除、添加元素,因此 Deque 的实现类既可当成队列使用,也可当成栈使用。Java 为 Deque 提供了 ArrayDeque 实现类和 LinkedList 两个实现类
- //把ArrayDeque当成栈使用import java.util.*;public class ArrayDequeStack{ public static void main(String[] args) { ArrayDeque stack = new ArrayDeque(); // 依次将三个元素push入"栈" stack.push("金州勇士"); stack.push("俄克拉荷马雷霆"); stack.push("克利夫兰骑士"); // 输出:[克利夫兰骑士, 俄克拉荷马雷霆, 金州勇士] System.out.println(stack); // 访问第一个元素,但并不将其pop出"栈",输出:克利夫兰骑士 System.out.println(stack.peek()); // 依然输出:[克利夫兰骑士, 俄克拉荷马雷霆, 金州勇士] System.out.println(stack); // pop出第一个元素,输出:克利夫兰骑士 System.out.println(stack.pop()); // 输出:[俄克拉荷马雷霆, 金州勇士] System.out.println(stack); }}
PriorityQueue 实现类
PriorityQueue 保存队列元素的顺序不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此当调用 peek() 或 pool() 方法取出队列中头部的元素时,并不是取出最先进入队列的元素,而是取出队列中的最小的元素
- public class PriorityQueueTest {
- public static void main(String[] args) {
- PriorityQueue pq = new PriorityQueue();
- pq.offer(6);
- pq.add( - 3);
- pq.add(20);
- pq.offer(18); //输出:[-3, 6, 20, 18] System.out.println(pq); }}
实际上,程序多次调用 poll() 方法,既可看到元素按从小到大的顺序" 移出队列 ",PriorityQueue 队列对元素的要求与 TreeSet 对元素的要求基本一致
PriorityQueue 不允许插入 null 元素,它还需要对队列元素进行排序,PriorityQueue 有两种排序方式
Dueue 接口与 ArrayDeque 实现类 Deque 接口
Deque 接口是 Queue 接口的子接口,它代表一个双端队列
Deque 与 Queue 的方法对照图
Deque 与 Stack 的方法对照图
ArrayDeque 实现类
ArrayDeque 是一个基于数组实现的双端队列,创建 Deque 时同样可指定一个 numElements 参数,该参数用于指定 Object[] 数组的长度;如果不指定 numElements 参数,Deque 底层数组的长度为 16
当程序中需要使用 "栈" 这种数据结构时,推荐使用 ArrayDeque,尽量避免使用 Stack——因为 Stack 是古老的集合,性能较差
- //把ArrayDeque当成栈使用import java.util.*;public class ArrayDequeStack{ public static void main(String[] args) { ArrayDeque stack = new ArrayDeque(); // 依次将三个元素push入"栈" stack.push("金州勇士"); stack.push("俄克拉荷马雷霆"); stack.push("克利夫兰骑士"); // 输出:[克利夫兰骑士, 俄克拉荷马雷霆, 金州勇士] System.out.println(stack); // 访问第一个元素,但并不将其pop出"栈",输出:克利夫兰骑士 System.out.println(stack.peek()); // 依然输出:[克利夫兰骑士, 俄克拉荷马雷霆, 金州勇士] System.out.println(stack); // pop出第一个元素,输出:克利夫兰骑士 System.out.println(stack.pop()); // 输出:[俄克拉荷马雷霆, 金州勇士] System.out.println(stack); }}
ArrayDeque 作为队列使用,按 "先进先出" 的方式操作集合元素
- import java.util. * ;
- public class ArrayDequeQueue {
- public static void main(String[] args) {
- ArrayDeque queue = new ArrayDeque(); // 依次将三个元素加入队列 queue.offer("克利夫兰骑士"); queue.offer("俄克拉荷马雷霆"); queue.offer("金州勇士"); // 输出:[克利夫兰骑士, 俄克拉荷马雷霆, 金州勇士] System.out.println(queue); // 访问队列头部的元素,但并不将其poll出队列"栈",输出:克利夫兰骑士 System.out.println(queue.peek()); // 依然输出:[克利夫兰骑士, 俄克拉荷马雷霆, 金州勇士] System.out.println(queue); // poll出第一个元素,输出:克利夫兰骑士 System.out.println(queue.poll()); // 输出:[俄克拉荷马雷霆, 金州勇士] System.out.println(queue); }}
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: