目录
Queue与List、Set接口并列的Collection的三大接口之一,是一种常见的数据结构,遵循先进先出的原则。
Queue是队列,只能一头进,另一头出。其可由LinkedList实现。
其常见方法:
- poll():将队首的元素删除,并返回该元素。
- peek():返回队首的元素,但不进行删除操作。
- offer():将元素添加到队尾,如果成功,则返回true。
Deque 是JDK 1.6出来的一个新接口,它是一个双端队列接口,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。
双端队列可使用LinkedList实现,代码实例:
- // 队列的创建
- Queue
queue = new LinkedList<>(); -
- // 添加元素
- System.out.println("------offer():添加元素------");
- queue.offer("Java");
- queue.offer("Python");
- queue.offer("C");
- queue.offer("PHP");
- System.out.println(queue);
-
- // 删除元素
- System.out.println("------poll(): 删除元素------");
- System.out.println("删除的元素: " + queue.poll());
- System.out.println(queue);
-
- // 访问元素
- System.out.println("------peek(): 访问元素------");
- System.out.println("访问的元素: " + queue.peek());
- System.out.println(queue);
-
- // 遍历
- System.out.println("------遍历------");
- for (String q: queue){
- System.out.println(q);
- }
- ------offer():添加元素------
- [Java, Python, C, PHP]
- ------poll(): 删除元素------
- 删除的元素: Java
- [Python, C, PHP]
- ------peek(): 访问元素------
- 访问的元素: Python
- [Python, C, PHP]
- ------遍历------
- Python
- C
- PHP
双端队列也可使用ArrayDeque实现,例如:
- Deque
deque = new ArrayDeque<>(); -
- // 添加元素
- deque.addFirst("I"); // 添加头部
- deque.addLast("Love"); // 添加尾部
- deque.addLast("Java");
- System.out.println(deque);
-
- System.out.println("------get()------");
- System.out.println(deque.getFirst()); // Java 获取头
- System.out.println(deque.getLast()); // I 获取尾
- System.out.println("--------poll()-------");
- System.out.println(deque.poll()); // 弹出栈顶元素
- System.out.println("--------push()-------");
- deque.push("Python"); // 此时第一个元素为LanQiao
- System.out.println(deque.pollFirst());// 弹出头 LanQiao
- System.out.println(deque.pollLast()); // 弹出尾 I
- deque.addFirst("PHP");
- System.out.println("--------peek()--------");
- System.out.println(deque.peek()); // 等价于peekFirst(),取出队头元素,但是队列中还是存在该元素
- System.out.println(deque.peekFirst());
- System.out.println(deque.peekLast());
- System.out.println(deque.size()); // 长度还是2
- System.out.println("=======real remove=========");
- System.out.println(deque.poll()); // poll才是真正的remove
- System.out.println(deque.size());
- [I, Love, Java]
- ------get()------
- I
- Java
- --------poll()-------
- I
- --------push()-------
- Python
- Java
- --------peek()--------
- PHP
- PHP
- Love
- 2
- =======real remove=========
- PHP
- 1
PriorityQueue保存队列元素的顺序并不是按照加入的顺序,而是按照队列元素的大小进行排序的。
PriorityQueue不允许插入null元素。
- PriorityQueue
deque = new PriorityQueue<>(); - deque.add(5);
- deque.add(9);
- deque.add(1);
- deque.add(-5);
- System.out.println(deque);
[-5, 1, 5, 9]
(1)add() && offer()
- 相同点:add()和offer()都是向队列中添加一个元素;
- 不同点:若队列有大小限制且已满,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false;
(2)poll() && remove()
- 相同点:remove() 和 poll() 方法都是从队列中删除第一个元素;
- 不同点:若队列为空时,调用remove()会抛出异常,调用poll() 方法返回 null;
(3)element() && peek()
- 相同点:element() 和 peek() 用于在队列的头部查询元素;
- 不同点:若队列为空时,element() 抛出一个异常,而 peek() 返回 null。
- import java.util.LinkedList;
- import java.util.Queue;
-
- public class Day27 {
- public static void main(String[] args){
- // 队列的创建
- Queue
queue = new LinkedList<>(); -
- // 添加元素
- System.out.println("------offer():添加元素------");
- queue.offer("Java");
- queue.offer("Python");
- queue.offer("C");
- queue.offer("PHP");
- System.out.println(queue);
-
- // 删除元素
- System.out.println("------poll(): 删除元素------");
- System.out.println("删除的元素: " + queue.poll());
- System.out.println(queue);
-
- // 访问元素
- System.out.println("------peek(): 访问元素------");
- System.out.println("访问的元素: " + queue.peek());
- System.out.println(queue);
-
- // 遍历
- System.out.println("------遍历------");
- for (String q: queue){
- System.out.println(q);
- }
- }
- }
- import java.util.ArrayDeque;
- import java.util.Deque;
-
- public class Day28 {
- public static void main(String[] args){
- Deque
deque = new ArrayDeque<>(); -
- // 添加元素
- deque.addFirst("I"); // 添加头部
- deque.addLast("Love"); // 添加尾部
- deque.addLast("Java");
- System.out.println(deque);
-
- System.out.println("------get()------");
- System.out.println(deque.getFirst()); // Java 获取头
- System.out.println(deque.getLast()); // I 获取尾
- System.out.println("--------poll()-------");
- System.out.println(deque.poll()); // 弹出栈顶元素
- System.out.println("--------push()-------");
- deque.push("Python"); // 此时第一个元素为LanQiao
- System.out.println(deque.pollFirst());// 弹出头 LanQiao
- System.out.println(deque.pollLast()); // 弹出尾 I
- deque.addFirst("PHP");
- System.out.println("--------peek()--------");
- System.out.println(deque.peek()); // 等价于peekFirst(),取出队头元素,但是队列中还是存在该元素
- System.out.println(deque.peekFirst());
- System.out.println(deque.peekLast());
- System.out.println(deque.size()); // 长度还是2
- System.out.println("=======real remove=========");
- System.out.println(deque.poll()); // poll才是真正的remove
- System.out.println(deque.size());
- }
- }
- import java.util.PriorityQueue;
-
- public class Day29 {
- public static void main(String[] args){
- PriorityQueue
deque = new PriorityQueue<>(); - deque.add(5);
- deque.add(9);
- deque.add(1);
- deque.add(-5);
- System.out.println(deque);
- }
- }