今天五四青年节,为了勋章……挂一个笔记;
Deque
- 支持在两端插入和移除元素
- ArrayDeque和LinkedList是Deque的两个通用实现,官方更推荐使用AarryDeque用作栈和队列;
- 初始化方法:
- Deque<Integer> stack = new LinkedList<Integer>();
- Deque<String> stack = new ArrayDeque<String>();【首选这个,效率更高!】
- 接口分析:
- 双向队列操作:
Deque 接口 |
抛出异常 |
效果 |
返回特殊值 |
效果 |
插入队首 |
addFirst(E e) |
向队头插入元素,如果元素为空,则发生NPE; |
offerFirst(E e) |
向队头插入元素,如果插入成功返回true,否则返回false; |
插入队尾 |
addLast(E e) |
向队尾插入元素,如果为空,则发生NPE; |
offerLast(E e) |
向队尾插入元素,如果插入成功返回true,否则返回false; |
删除队首 |
removeFirst() |
返回并移除队头元素,如果该元素是null,则发生NoSuchElementException; |
pollFirst(), |
返回并移除队头元素,如果队列无元素,则返回null; |
删除队尾 |
removeLast() |
返回并移除队尾元素,如果该元素是null,则发生NoSuchElementException; |
pollLast() |
返回并移除队尾元素,如果队列无元素,则返回null; |
查询队首元素 |
getFirst() |
获取队头元素但不移除,如果队列无元素,则发生NoSuchElementException; |
peekFirst() |
获取队头元素但不移除,如果队列无元素,则返回null; |
查询队尾元素 |
getLast() |
获取队尾元素但不移除,如果队列无元素,则发生NoSuchElementException; |
peekLast() |
获取队尾元素但不移除,如果队列无元素,则返回null; |
- 栈操作:
- pop(): 弹出栈中元素,也就是返回并移除队头元素,等价于removeFirst(),如果队列无元素,则发生NoSuchElementException
- push(): 向栈中压入元素,也就是向队头增加元素,等价于addFirst(),如果元素为null,则发生NPE,如果栈空间受到限制,则发生IllegalStateException
- 应用场景
- 满足FIFO(First Input First Output,先进先出)场景时;
- 满足LIFO(Last in, First out,后进先出)场景时,曾经在解析XML按标签时使用过栈这种数据结构,但是却选择Stack类,如果在进行栈选型时,更推荐使用Deque类,应为Stack是线程同步;
- 主要实现
- ArrayDeque: 基于数组实现的线性双向队列【更推荐使用】
- LinkedList: 基于链表实现的链式双向队列
- 用法:
- LinkedList<Integer> itemList = new LinkedList<>();
- itemList.addFirst(tmpNode.val);
- itemList.addLast(tmpNode.val);
- 用法:
Queue
- Queue 是单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循 先进先出(FIFO) 规则;
- Queue 接口继承自Collection接口,扩展了 Collection 的接口,根据 因为容量问题而导致操作失败后处理方式的不同 可以分为两类方法: 一种在操作失败后会抛出异常,另一种则会返回特殊值;
Queue 接口 |
抛出异常 |
返回特殊值 |
||
插入队尾 |
add(E e) |
offer(E e) |
失败显示false |
|
删除队首 |
remove() |
poll() |
失败显示null |
|
查询队首元素 |
element() |
peek() |
失败显示null |
这么基础的东西,没有谁抄谁之说吧,顶多是融合的好多,反复狗头保命;