日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java队列 Deque

發布時間:2024/9/30 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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出隊和入隊的方法:

QueueDeque
添加元素到隊尾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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。