Deque是接口,具體繼承關係爲:Collection-->Queue-->Deque-->LinkedList、ArrayDeque、LinkedBlockingDeque
Collection 是層次集合結構中的根接口。Collection 表示一組對象,這些對象也稱爲 Collection 的元素。
Queue(隊列)接口與List、Set同一級別,都是繼承了Collection接口。Queue使用時要儘量避免Collection的add()和remove()方法,而是要使用offer()來加入元素,使用poll()來獲取並移出元素。它們的優點是通過返回值可以判斷成功與否,add()和remove()方法在失敗的時候會拋出異常。 如果要使用前端而不移出該元素,使用element()或者peek()方法。
Deque(雙端隊列)接口支持兩端插入和移除元素。名稱deque 是“double ended queue(雙端隊列)”的縮寫,通常讀爲“deck”。
實現了Deque的類有LinkedList、ArrayDeque、LinkedBlockingDeque。
LinkedList是大家用的比較多的,LinkedList不僅實現了Deque接口,還實現了List接口。LinkedList內部實現用的是鏈接鏈表(它的get()是比較慢的,而ArrayList內部實現用的是數組)。ArrayDeque是Deque接口的數組形式的實現,此類很可能在用作堆棧時快於Stack,在用作隊列時快於LinkedList。LinkedBlockingDeque是鏈表形式實現的阻塞雙端隊列(當超過隊列容量了,put操作會被阻塞,一直等待可用空間)。
此時我們再看Collections.asLifoQueue(deque)方法,它返回得就是一個棧形式的隊列。具體見示例代碼:
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
public class CollectionsTest {
public static void main(String[] args) {
LinkedList<Integer> llist1 = new LinkedList<Integer>(Arrays.asList(2, 4, 6));
System.out.println(llist1);
System.out.println(llist1.add(5));
System.out.println(llist1);
System.out.println(llist1.offer(9));
System.out.println(llist1);
System.out.println(llist1.element());
System.out.println(llist1.peek());
System.out.println(llist1);
System.out.println(llist1.poll());
System.out.println(llist1);
System.out.println("-------------------------");
LinkedList<Integer> llist2 = new LinkedList<Integer>(Arrays.asList(2, 4, 6));
Queue q = Collections.asLifoQueue(llist2);
System.out.println(q);
System.out.println(q.add(5));
System.out.println(q);
System.out.println(q.offer(9));
System.out.println(q);
System.out.println(q.element());
System.out.println(q.peek());
System.out.println(q);
System.out.println(q.poll());
System.out.println(q);
}
}