java提高 queue集合

2021-08-26 20:42:09 字數 2981 閱讀 4794

什麼是queue集合?

答:queue用於模擬佇列這種資料結構。佇列通常是指「先進先出(fifo)」的容器。佇列的頭部儲存在佇列中存放時間最長的元素,尾部儲存存放時間最短的元素。

新元素插入到佇列的尾部,取出元素會返回佇列頭部的元素。通常,佇列不允許隨機訪問佇列中的元素。

1、queue 方法介紹

從上面來看,queue(佇列)介面繼承自collection,用來表示內部元素具有先後順序的集合。除了基本的集合操作外,佇列還提供了其他插入、刪除和檢查操作。queue介面定義如下:

public inte***ce queueextends collection
queue介面結構如下圖所示:

操作

丟擲異常

返回特殊值插入

add(e)

offer(e)

移除remove()

poll()

檢查element()

peek()

(1).add(e), offer(e) 在尾部新增:

他們的共同之處是建議實現類禁止新增 null 元素,否則會報空指標 nullpointerexception;

不同之處在於 add() 方法在新增失敗(比如佇列已滿)時會報 一些執行時錯誤 錯;而 offer() 方法即使在新增失敗時也不會奔潰,只會返回 false。

(2)remove(), poll() 刪除並返回頭部

當隊列為空時 remove() 方法會報 nosuchelementexception 錯; 而 poll() 不會奔潰,只會返回 null。

(3)element(), peek() 獲取但不刪除

當隊列為空時 element() 丟擲異常;peek() 不會奔潰,只會返回 null。

2、其它

(1)雖然 linkedlist 沒有禁止新增 null,但是一般情況下 queue 的實現類都不允許新增 null 元素,因為 poll(), peek() 方法在異常的時候會返回 null,你新增了 null 以後,當獲取時不好分辨究竟是否正確返回。

(2)queue 一般都是 fifo 的,但是也有例外,比如優先佇列 priority queue(它的順序是根據自然排序或者自定義 comparator 的);再比如 lifo 的佇列(跟棧一樣,後來進去的先出去)。

(3)不論進入、出去的先後順序是怎樣的,使用 remove(),poll() 方法操作的都是 頭部 的元素;而插入的位置則不一定是在隊尾了,不同的 queue 會有不同的插入邏輯。

priorityqueue是乙個比較標準的佇列實現類。priorityqueue儲存佇列元素的順序並不是按加入佇列的順序,而是按佇列元素的大小進行重新排列。因此當呼叫peek()方法或者poll()方法取出隊

列中的元素時,並不是取出最先進入佇列的元素,而是取出佇列中最小的元素。

1、priorityqueue的排序方式

priorityqueue中的元素可以預設自然排序(也就是數字預設是小的在佇列頭,字串則按字典序排列)或者通過提供的comparator(比較器)在佇列例項化時指定的排序方式。

(1)小案例

priorityqueueqi = new priorityqueue();

qi.offer(5);

qi.offer(2);

qi.offer(1);

qi.offer(10);

qi.offer(3);

while (!qi.isempty())

system.out.println();

//採用降序排列的方式,越小的越排在隊尾

comparatorcmp = new comparator()

};//這裡是初始容量3,當我們超過3個會自動擴容,所以說它是個無邊界容器

priorityqueueq2 = new priorityqueue(3,cmp);

q2.offer(2);

q2.offer(8);

q2.offer(9);

q2.offer(1);

while (!q2.isempty())

輸出結果:

由此可以看出,預設情況下priorityqueue採用自然排序。指定comparator的情況下,priorityqueue採用指定的排序方式。

注意:當priorityqueue中沒有指定comparator時,加入priorityqueue的元素必須實現了comparable介面(即元素是可比較的),否則會導致 classcastexception。

(比如你放入的是物件,那麼必須指定comparator,因為物件是無法比較的)

2、 priorityqueue特性 

(1)佇列元素根據自然排序或者根據具體的比較器排序

(2)例項化時若未指定初始容量,預設容量為11

(3)自動擴容。如果容量小於64,兩倍增長擴容;否則增長50%

(4)無邊界容器

(5)不支援null元素

(6)非執行緒安全

(7)支援被序列化

(8)入隊出隊的時間複雜度o(log(n))

有關dueue介面與arraydeque實現類和linkedlist實現類以後用到了再寫他們。

現在只要知道:

(1)deque介面是queue介面的子介面,它代表乙個雙端佇列。

(2)linkedlist是list介面的實現類,因此它可以是乙個集合,可以根據索引來隨機訪問集合中的元素。此外,它還是duque介面的實現類,因此也可以作為乙個雙端佇列,或者棧來使用。

想太多,做太少,中間的落差就是煩惱。想沒有煩惱,要麼別想,要麼多做。少校

list集合與queue集合

1 特點 元素是有序 可重複的,因為該集合體系有索引。list體系下listiterator介面在iterator介面基礎上增加了如下方法 void add object o 在指定位置插入乙個元素 2 實現類 arraylist和vector作為list類的兩個典型實現,完全支援之前介紹的list...

C 集合 佇列 Queue

什麼是佇列 它代表了乙個先進先出的物件集合。當您需要對各項進行先進先出的訪問時,則使用佇列。當您在列表中新增一項,稱為入隊,當您從列表中移除一項時,稱為出隊。queue類常用的屬性 屬性描述 count 獲取queue中包含的元素個數 queue類常用的方法 方法名描述public virtual ...

Collection集合 Queue佇列

該集合特點 先進先出fifo 通過arraydeque實現 queue queue newarraydeque 通過linkedlist實現 queue queue1 newlinkedlist 將指定的元素插入此佇列 boolea offer e e 獲取並移除此佇列的頭 e poll 其遍歷方式...