介紹Deque
Deque 是JDK 1.6出來的一個新接口,它是一個雙端隊列接口,繼承自Queue接口,Deque的實現類是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。
Deque有三種用途
- 普通隊列(一端進另一端出): Queue queue = new LinkedList()或Deque deque = new LinkedList()
- 雙端隊列(兩端都可進出):Deque deque = new LinkedList()
- 堆棧:Deque deque = new LinkedList()
注意:Java堆棧Stack類已經過時,Java官方推薦使用Deque替代Stack使用。Deque堆棧操作方法:push()、pop()、peek()。
模擬隊列
Deque接口擴展(繼承)了 Queue 接口。在將雙端隊列用作隊列時,將得到 FIFO(先進先出)行為。將元素添加到雙端隊列的末尾,從雙端隊列的開頭移除元素。從 Queue 接口繼承的方法完全等效於 Deque 方法,如下表所示:
Queue方法 | 等效Deque方法 |
add add(e) | addLast(e) |
offer(e) | offerLast(e) |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
模擬棧
雙端隊列也可用作 LIFO(后進先出)堆棧。應優先使用此接口而不是遺留 Stack 類。在將雙端隊列用作堆棧時,元素被推入雙端隊列的開頭並從雙端隊列開頭彈出。堆棧方法完全等效於 Deque 方法,如下表所示:
堆棧方法 | 等效Deque方法 |
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
peek()方法的功能官網源碼描述
Java代碼實現
public class Main { public static void main(String[] args) { // 默認構造器 Deque<String> deque = new LinkedList<>(); // 先添加的先到尾部 deque.addFirst("I"); deque.addFirst("Like"); deque.addFirst("Java"); /* * 此時deque中元素的位置: * Java * Like * I */ 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("LanQiao"); // 此時第一個元素為LanQiao System.out.println(deque.pollFirst());// 彈出頭 LanQiao System.out.println(deque.pollLast()); // 彈出尾 I deque.addFirst("LZP"); 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()); } }
運行結果