目录
Queue与List、Set接口并列的Collection的三大接口之一,是一种常见的数据结构,遵循先进先出的原则。
一、Queue
Queue是队列,只能一头进,另一头出。其可由LinkedList实现。
其常见方法:
- poll():将队首的元素删除,并返回该元素。
- peek():返回队首的元素,但不进行删除操作。
- offer():将元素添加到队尾,如果成功,则返回true。
二、Deque
Deque 是JDK 1.6出来的一个新接口,它是一个双端队列接口,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。
(一)LinkedList
双端队列可使用LinkedList实现,代码实例:
// 队列的创建
Queue<String> 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
双端队列也可使用ArrayDeque实现,例如:
Deque<String> 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保存队列元素的顺序并不是按照加入的顺序,而是按照队列元素的大小进行排序的。
PriorityQueue不允许插入null元素。
PriorityQueue<Integer> 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。
三、代码
1、Queue
import java.util.LinkedList;
import java.util.Queue;
public class Day27 {
public static void main(String[] args){
// 队列的创建
Queue<String> 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);
}
}
}
2、Deque
import java.util.ArrayDeque;
import java.util.Deque;
public class Day28 {
public static void main(String[] args){
Deque<String> 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());
}
}
3、PriorityQueue
import java.util.PriorityQueue;
public class Day29 {
public static void main(String[] args){
PriorityQueue<Integer> deque = new PriorityQueue<>();
deque.add(5);
deque.add(9);
deque.add(1);
deque.add(-5);
System.out.println(deque);
}
}