1、Deque(double ended queue)
1.1 定义
- Deque是JDK 1.6出的一个新接口,它是一个
双端队列接口,可以在首尾插入或删除元素
- Deque接口继承自Queue接口,Deque的实现类是LinkedList(基于链表)、ArrayDeque(基于循环数组)、LinkedBlockingDeque,其中
LinkedList是最常用的
。 - Queue是FIFO的单端队列(一端进,一端出),Deque是双端队列(两端都可以进出)
1.2 Deque的三种用途
- 普通队列(一端进另一端出): Queue queue = new LinkedList()或Deque deque = new LinkedList()
- 双端队列(两端都可进出):Deque deque = new LinkedList()
- 栈:Deque deque = new LinkedList()(
栈java.util.Stack类已经过时,Java官方推荐使用java.util.Deque替代Stack使用。Deque栈的操作方法:push()、pop()、peek()
)
1.3 特点
- 插入、删除、获取操作支持两种形式:抛异常 和 返回null或true/false
既具有FIFO(先进先出)特点又具有LIFO(后进先出)特点,即是队列又是栈
- 不推荐插入null元素,null作为特定返回值表示队列为空
- 未定义基于元素相等的equals和hashCode
1.4 方法
遇到失败抛出异常 | 遇到失败会返回特殊值(false或null) |
---|
addFirst(): 向队头插入元素,如果元素为空,则发生NPE(空指针异常) | offerFirst(): 向队头插入元素,如果插入成功返回true,否则返回false |
addLast(): 向队尾插入元素,如果为空,则发生NPE | offerLast(): 向队尾插入元素,如果插入成功返回true,否则返回false |
removeFirst(): 返回并移除队头元素,如果该元素是null,则发生NoSuchElementException | pollFirst(): 返回并移除队头元素,如果队列无元素,则返回null |
removeLast(): 返回并移除队尾元素,如果该元素是null,则发生NoSuchElementException | pollLast(): 返回并移除队尾元素,如果队列无元素,则返回null |
getFirst(): 获取队头元素但不移除,如果队列无元素,则发生NoSuchElementException | peekFirst(): 获取队头元素但不移除,如果队列无元素,则返回null |
getLast(): 获取队尾元素但不移除,如果队列无元素,则发生NoSuchElementException | peekLast(): 获取队尾元素但不移除,如果队列无元素,则返回null |
2、栈
2.1 栈的两种实现方法
Deque<Integer> stack = new LinkedList<Integer>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.pop());
System.out.println(stack.peek());
System.out.println(stack.peek());
Stack<Integer> stack2 = new Stack<>();
stack2.push(4);
stack2.push(5);
stack2.push(6);
System.out.println(stack2.pop());
System.out.println(stack2.peek());
System.out.println(stack2.peek());
2.2 Deque与Stack对应的接口
3、队列
3.1 队列的两种实现方式
package Stack_Queue;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class 队列 {
public static void main(String[] args) {
Deque<Integer> queue = new LinkedList<Integer>();
queue.add(1);
queue.add(2);
queue.offer(3);
queue.offer(4);
System.out.println(queue.remove());
System.out.println(queue.poll());
System.out.println(queue.element());
System.out.println(queue.peek());
Queue<Integer> queue2 = new ArrayDeque<>();
queue2.add(1);
queue2.add(2);
queue2.offer(3);
queue2.offer(4);
System.out.println(queue2.remove());
System.out.println(queue2.poll());
System.out.println(queue2.element());
System.out.println(queue2.peek());
}
}
3.2 Deque与Queue对应的接口
参考:
Java双向队列Deque栈与队列
java关于Deque的使用
Java队列Deque使用详解