Java 中佇列的使用

weixin_33860553發表於2014-11-13

剛才看見群裡的一個朋友在問佇列的使用,確實在現實的寫程式碼中非常少使用佇列的,反正我是從來沒使用過。僅僅是學資料結構的時候學過。

以下是我寫的一個小樣例,希望有不足之處請提出改正。O(∩_∩)O~

看程式碼:

import java.util.LinkedList; import java.util.Queue; public class TestQueue { /** * @param args * @author JavaAlpha * Info 測試佇列 */ public static void main(String[] args) { Queue<String> queue = new LinkedList<String>(); queue.offer("1");//插入一個元素 queue.offer("2"); queue.offer("3"); //列印元素個數 System.out.println("queue.size()"+queue.size()); //遍歷列印全部的元素,安裝插入是順序列印 for (String string : queue) { System.out.println(string); } } } 列印內容: queue.size()3 1 2 3

 

以下是API中對佇列的說明:

 

public interface Queue<E>
extends Collection<E>

在處理元素前用於儲存元素的 collection。除了主要的 Collection 操作外,佇列還提供其它的插入、提取和檢查操作。每一個方法都存在兩種形式:一種丟擲異常(操作失敗時),還有一種返回一個特殊值(nullfalse,詳細取決於操作)。插入操作的後一種形式是用於專門為有容量限制的 Queue 實現設計的;在大多數實現中,插入操作不會失敗。

  丟擲異常 返回特殊值
插入 add(e) offer(e)
移除 remove() poll()
檢查 element() peek()

佇列通常(但並不是一定)以 FIFO(先進先出)的方式排序各個元素。只是優先順序佇列和 LIFO 佇列(或堆疊)例外,前者依據提供的比較器或元素的自然順序對元素進行排序,後者按 LIFO(後進先出)的方式對元素進行排序。不管使用哪種排序方式,佇列的 都是呼叫 remove()poll() 所移除的元素。在 FIFO 佇列中,全部的新元素都插入佇列的末尾。其它種類的佇列可能使用不同的元素放置規則。每一個 Queue 實現必須指定其順序屬性。

假設可能,offer 方法可插入一個元素,否則返回 false。這與 Collection.add 方法不同,該方法僅僅能通過丟擲未經檢查的異常使加入元素失敗。offer 方法設計用於正常的失敗情況,而不是出現異常的情況,比如在容量固定(有界)的佇列中。

remove()poll() 方法可移除和返回佇列的頭。究竟從佇列中移除哪個元素是佇列排序策略的功能,而該策略在各種實現中是不同的。remove()poll() 方法僅在佇列為空時其行為有所不同:remove() 方法丟擲一個異常,而 poll() 方法則返回 null

element()peek() 返回,但不移除,佇列的頭。

Queue 介面並沒有定義堵塞佇列的方法,而這在併發程式設計中是非經常見的。BlockingQueue 介面定義了那些等待元素出現或等待佇列中有可用空間的方法,這些方法擴充套件了此介面。

Queue 實現通常不同意插入 null 元素,雖然某些實現(如 LinkedList)並不禁止插入 null。即使在同意 null 的實現中,也不應該將 null 插入到 Queue 中,由於 null 也用作 poll 方法的一個特殊返回值,表明佇列不包括元素。

Queue 實現通常沒有定義 equalshashCode 方法的基於元素的版本號,而是從 Object 類繼承了基於身份的版本號,由於對於具有同樣元素但有不同排序屬性的佇列而言,基於元素的相等性並不是總是定義良好的。

 

相關文章