直接上代碼吧。
package collections; import java.util.Deque; import java.util.LinkedList; /** * @Package collections * @date 2017-11-28下午5:53:32 */ public class DequeTest { /** * @param args */ public static void main(String[] args) { Deque<String> deque = new LinkedList<String>(); deque.add("d"); deque.add("e"); deque.add("f"); //從隊首取出元素,不會刪除 System.out.println("隊首取出元素:"+deque.peek()); System.out.println("隊列為:"+deque); //從隊首加入元素(隊列有容量限制時用,無則用addFirst) deque.offerFirst("c"); System.out.println("隊首加入元素后為:"+deque); //從隊尾加入元素(隊列有容量限制時用,無則用addLast) deque.offerLast("g"); System.out.println("隊尾加入元素后為:"+deque); //隊尾加入元素 deque.offer("h"); System.out.println("隊尾加入元素后為:"+deque); //獲取並移除隊列第一個元素,pollFirst()也是,區別在於隊列為空時,removeFirst會拋出NoSuchElementException異常,后者返回null deque.removeFirst(); System.out.println("獲取並移除隊列第一個元素后為:"+deque); //獲取並移除隊列第一個元素,此方法與pollLast 唯一區別在於隊列為空時,removeLast會拋出NoSuchElementException異常,后者返回null deque.removeLast(); System.out.println("獲取並移除隊列最后一個元素后為:"+deque); //獲取隊列第一個元素.此方法與 peekFirst 唯一的不同在於:如果此雙端隊列為空,它將拋出NoSuchElementException,后者返回null System.out.println("獲取隊列第一個元素為:"+deque.getFirst()); System.out.println("獲取隊列第一個元素后為:"+deque); //獲取隊列最后一個元素.此方法與 peekLast 唯一的不同在於:如果此雙端隊列為空,它將拋出NoSuchElementException,后者返回null System.out.println("獲取隊列最后一個元素為:"+deque.getLast()); System.out.println("獲取隊列第一個元素后為:"+deque); //循環獲取元素並在隊列移除元素 while(deque.size()>0){ System.out.println("獲取元素為:"+ deque.pop()+" 並刪除"); } System.out.println("隊列為:"+deque); } }
結果如下:
隊首取出元素:d
隊列為:[d, e, f]
隊首加入元素后為:[c, d, e, f]
隊尾加入元素后為:[c, d, e, f, g]
隊尾加入元素后為:[c, d, e, f, g, h]
獲取並移除隊列第一個元素后為:[d, e, f, g, h]
獲取並移除隊列最后一個元素后為:[d, e, f, g]
獲取隊列第一個元素為:d
獲取隊列第一個元素后為:[d, e, f, g]
獲取隊列最后一個元素為:g
獲取隊列第一個元素后為:[d, e, f, g]
獲取元素為:d 並刪除
獲取元素為:e 並刪除
獲取元素為:f 並刪除
獲取元素為:g 並刪除
隊列為:[]
繼承關系是:deque => queue => collection=》Iterable
1.使用隊列的時候,new LinkedList的時候為什么用deque接收,不用LinkedList呢?
答:deque繼承queue接口,因為它有兩個實現,LinkedList與ArrayDeque。用deque接收是因為向上轉型(子類往父類轉,會丟失子類的特殊功能)了。可以試試,用get()方法,LinkedList接收才有。
2.為什么有一個實現還不夠,還弄兩個呢,它們總有區別吧?
答:ArrayDeque是基於頭尾指針來實現的Deque,意味着不能訪問除第一個和最后一個元素。想訪問得用迭代器,可以正反迭代。
ArrayDeque一般優於鏈表隊列/雙端隊列,有限數量的垃圾產生(舊數組將被丟棄在擴展),建議使用deque,ArrayDeque優先。