<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關注后端架構、中間件、分布式和并發編程

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

     

    有一段時間沒有更新了。接著上節繼續吧。

    Queue除了前面介紹的實現外,還有一種雙向的Queue實現Deque。這種隊列允許在隊列頭和尾部進行入隊出隊操作,因此在功能上比Queue顯然要更復雜。下圖描述的是Deque的完整體系圖。需要說明的是LinkedList也已經加入了Deque的一部分(LinkedList是從jdk1.2 開始就存在數據結構)。

     

    Deque體系結構

    Deque在Queue的基礎上增加了更多的操作方法。

    Deque操作方法

    從上圖可以看到,Deque不僅具有FIFO的Queue實現,也有FILO的實現,也就是不僅可以實現隊列,也可以實現一個堆棧。

    同時在Deque的體系結構圖中可以看到,實現一個Deque可以使用數組(ArrayDeque),同時也可以使用鏈表(LinkedList),還可以同實現一個支持阻塞的線程安全版本隊列LinkedBlockingDeque。

    image 對于數組實現的Deque來說,數據結構上比較簡單,只需要一個存儲數據的數組以及頭尾兩個索引即可。由于數組是固定長度的,所以很容易就得到數組的頭和尾,那么對于數組的操作只需要移動頭和尾的索引即可。

    特別說明的是ArrayDeque并不是一個固定大小的隊列,每次隊列滿了以后就將隊列容量擴大一倍(doubleCapacity()),因此加入一個元素總是能成功,而且也不會拋出一個異常。也就是說ArrayDeque是一個沒有容量限制的隊列。

    同樣繼續性能的考慮,使用System.arraycopy復制一個數組比循環設置要高效得多。

     

     

     

     

     

    image

    對于LinkedList本身而言,數據結構就更簡單了,除了一個size用來記錄大小外,只有head一個元素Entry。對比Map和Queue的其它數據結構可以看到這里的Entry有兩個引用,是雙向的隊列。

    在示意圖中,LinkedList總是有一個“傀儡”節點,用來描述隊列“頭部”,但是并不表示頭部元素,它是一個執行null的空節點。

    隊列一開始只有head一個空元素,然后從尾部加入E1(add/addLast),head和E1之間建立雙向鏈接。然后繼續從尾部加入E2,E2就在head和E1之間建立雙向鏈接。最后從隊列的頭部加入E3(push/addFirst),于是E3就在E1和head之間鏈接雙向鏈接。

    雙向鏈表的數據結構比較簡單,操作起來也比較容易,從事從“傀儡”節點開始,“傀儡”節點的下一個元素就是隊列的頭部,前一個元素是隊列的尾部,換句話說,“傀儡”節點在頭部和尾部之間建立了一個通道,是整個隊列形成一個循環,這樣就可以從任意一個節點的任意一個方向能遍歷完整的隊列。

    同樣LinkedList也是一個沒有容量限制的隊列,因此入隊列(不管是從頭部還是尾部)總能成功。

     

     

     

     

     

     

    上面描述的ArrayDeque和LinkedList是兩種不同方式的實現,通常在遍歷和節省內存上ArrayDeque更高效(索引更快,另外不需要Entry對象),但是在隊列擴容下LinkedList更靈活,因為不需要復制原始的隊列,某些情況下可能更高效。

    同樣需要注意的上述兩個實現都不是線程安全的,因此只適合在單線程環境下使用,下面章節要介紹的LinkedBlockingDeque就是線程安全的可阻塞的Deque。事實上也應該是功能最強大的Queue實現,當然了實現起來也許會復雜一點。

     



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2010-08-12 00:13 imxylz 閱讀(13608) 評論(4)  編輯  收藏 所屬分類: Java Concurrency

    評論

    # re: 深入淺出 Java Concurrency (24): 并發容器 part 9 雙向隊列集合 Deque[未登錄] 2010-08-12 12:58 行云流水
    等的好辛苦,加油。哈哈  回復  更多評論
      

    # re: 深入淺出 Java Concurrency (24): 并發容器 part 9 雙向隊列集合 Deque 2010-08-16 16:05 旺才
    什么時候更新完呀  回復  更多評論
      

    # re: 深入淺出 Java Concurrency (24): 并發容器 part 9 雙向隊列集合 Deque 2010-08-16 16:08 xylz
    @旺才
    哎,最近工作忙,更新沒有規律了  回復  更多評論
      

    # re: 深入淺出 Java Concurrency (24): 并發容器 part 9 雙向隊列集合 Deque 2011-04-09 16:53 hAdIx
    請問圖是用什么軟件畫的?  回復  更多評論
      


    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 亚洲第一成年男人的天堂| 亚洲gv猛男gv无码男同短文| 亚洲w码欧洲s码免费| **一级一级毛片免费观看| 亚洲高清中文字幕| 四虎精品视频在线永久免费观看| 久久亚洲私人国产精品| 麻花传媒剧在线mv免费观看 | 亚洲午夜激情视频| 精品一区二区三区免费观看| 亚洲日韩一页精品发布| 国产精品网站在线观看免费传媒| 久久久亚洲精品视频| 亚洲一区免费在线观看| 亚洲熟妇无码一区二区三区| 全部免费a级毛片| 91免费福利视频| 亚洲成aⅴ人片在线观| 扒开双腿猛进入爽爽免费视频| 亚洲国产精品嫩草影院| 久久亚洲高清综合| 久久久久久夜精品精品免费啦| 亚洲avav天堂av在线网爱情| 日本不卡在线观看免费v| 一个人看www免费高清字幕| 亚洲AV日韩AV天堂一区二区三区 | 成年丰满熟妇午夜免费视频| 色噜噜狠狠色综合免费视频| 亚洲日韩乱码中文无码蜜桃臀网站 | 桃子视频在线观看高清免费视频| 亚洲午夜久久久久久尤物| 日日夜夜精品免费视频| a毛片免费播放全部完整| 亚洲一区二区三区免费观看| 尤物永久免费AV无码网站| 天堂在线免费观看| 亚洲熟妇无码一区二区三区| 亚洲国产精品成人精品无码区在线 | a级成人免费毛片完整版| 亚洲综合色丁香婷婷六月图片| 亚洲中文无韩国r级电影|