Java队列 Deque
轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/120828826
本文出自【趙彥軍的博客】
Java隊列 Queue
Java隊列 Deque
Java隊列 PriorityQueue
Java棧 Stack
Java阻塞隊列 LinkedBlockingDeque
文章目錄
- Deque
- 小結
Deque
我們知道,Queue 是隊列,只能一頭進,另一頭出。
如果把條件放松一下,允許兩頭都進,兩頭都出,這種隊列叫雙端隊列(Double Ended Queue),學名Deque。
Java集合提供了接口Deque來實現一個雙端隊列,它的功能是:
- 既可以添加到隊尾,也可以添加到隊首;
- 既可以從隊首獲取,又可以從隊尾獲取。
我們來比較一下Queue和Deque出隊和入隊的方法:
| 添加元素到隊尾 | add(E e) / offer(E e) | addLast(E e) / offerLast(E e) |
| 取隊首元素并刪除 | E remove() / E poll() | E removeFirst() / E pollFirst() |
| 取隊首元素但不刪除 | E element() / E peek() | E getFirst() / E peekFirst() |
| 添加元素到隊首 | 無 | addFirst(E e) / offerFirst(E e) |
| 取隊尾元素并刪除 | 無 | E removeLast() / E pollLast() |
| 取隊尾元素但不刪除 | 無 | E getLast() / E peekLast() |
對于添加元素到隊尾的操作,Queue提供了add()/offer()方法,而Deque提供了addLast()/offerLast()方法。添加元素到對首、取隊尾元素的操作在Queue中不存在,在Deque中由addFirst()/removeLast()等方法提供。
注意到Deque接口實際上擴展自Queue:
public interface Deque<E> extends Queue<E> {... }因此,Queue提供的add()/offer()方法在Deque中也可以使用,但是,使用Deque,最好不要調用offer(),而是調用offerLast():
public class Main {public static void main(String[] args) {Deque<String> deque = new LinkedList<>();deque.offerLast("A"); // Adeque.offerLast("B"); // A <- Bdeque.offerFirst("C"); // C <- A <- BSystem.out.println(deque.pollFirst()); // C, 剩下A <- BSystem.out.println(deque.pollLast()); // B, 剩下ASystem.out.println(deque.pollFirst()); // ASystem.out.println(deque.pollFirst()); // null} }如果直接寫deque.offer(),我們就需要思考,offer()實際上是offerLast(),我們明確地寫上offerLast(),不需要思考就能一眼看出這是添加到隊尾。
因此,使用Deque,推薦總是明確調用offerLast()/offerFirst()或者pollFirst()/pollLast()方法。
Deque是一個接口,它的實現類有ArrayDeque和LinkedList。
我們發現LinkedList真是一個全能選手,它即是List,又是Queue,還是Deque。但是我們在使用的時候,總是用特定的接口來引用它,這是因為持有接口說明代碼的抽象層次更高,而且接口本身定義的方法代表了特定的用途。
// 不推薦的寫法: LinkedList<String> d1 = new LinkedList<>(); d1.offerLast("z"); // 推薦的寫法: Deque<String> d2 = new LinkedList<>(); d2.offerLast("z");可見面向抽象編程的一個原則就是:盡量持有接口,而不是具體的實現類。
小結
Deque實現了一個雙端隊列(Double Ended Queue),它可以:
- 將元素添加到隊尾或隊首:addLast()/offerLast()/addFirst()/offerFirst();
- 從隊首/隊尾獲取元素并刪除:removeFirst()/pollFirst()/removeLast()/pollLast();
- 從隊首/隊尾獲取元素但不刪除:getFirst()/peekFirst()/getLast()/peekLast();
- 總是調用xxxFirst()/xxxLast()以便與Queue的方法區分開;
避免把null添加到隊列。
總結
以上是生活随笔為你收集整理的Java队列 Deque的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java队列 Queue
- 下一篇: Java队列 PriorityQueue