簡介
- Queue是一種很常見的數據結構類型,在java里面Queue是一個接口,它只是定義了一個基本的Queue應該有哪些功能規約。實際上有多個Queue的實現,有的是采用線性表實現,有的基于鏈表實現。還有的適用于多線程的環境。java中具有Queue功能的類主要有如下幾個:AbstractQueue, ArrayBlockingQueue, ConcurrentLinkedQueue, LinkedBlockingQueue, DelayQueue, LinkedList, PriorityBlockingQueue, PriorityQueue和ArrayDqueue。在本文中,我們主要討論常用的兩種實現:LinkedList和ArrayDeque。
Queue
- Queue本身是一種先入先出的模型(FIFO),和我們日常生活中的排隊模型很類似。根據不同的實現,他們主要有數組和鏈表兩種實現形式
- 因為在隊列里和我們日常的模型很近似,每次如果要出隊的話,都是從隊頭移除。而如果每次要加入新的元素,則要在隊尾加。所以我們要在隊列里保存隊頭和隊尾。
在jdk里幾個常用隊列實現之間的類關系圖如下:
Paste_Image.png
Deque
按照我們一般的理解,Deque是一個雙向隊列,這將意味著它不過是對Queue接口的增強。如果仔細分析Deque接口代碼的話,我們會發現它里面主要包含有4個部分的功能定義。
- 雙向隊列特定方法定義。
- Queue方法定義。
- Stack方法定義。
- Collection方法定義。
第3,4部分的方法相當于告訴我們,具體實現Deque的類我們也可以把他們當成Stack和普通的Collection來使用。這也是接口定義規約帶來的好處。這里我們就不再贅述。
ArrayDeque
有了我們前面幾篇分析的基礎,我們可以很容易猜到ArrayDeque的內部實現機制。它的內部使用一個數組來保存具體的元素,然后分別使用head, tail來指示隊列的頭和尾。他們的定義如下: