優質作者名單
J**A 併發基礎知識:Deque 介面和 Queue 介面之間有什麼區別? - 程式設計師古德deque
(雙端佇列)和queue
(queues) 是 J**A 集合框架中處理元素排隊和排隊的兩個介面,但它們之間存在一些重要差異,如下所示:
1. 佇列介面
queue
該介面表示先進先出 (FIFO) 佇列,該佇列只能從一端新增元素並從另一端刪除元素,因此可以使用add()
offer()
將元素新增到佇列末尾的方法,使用remove()
poll()
如果嘗試從空佇列中刪除元素,則從佇列頭部刪除元素的方法remove()
方法將被丟擲nosuchelementexception
而poll()
方法返回null
2.Deque介面
deque
該介面,即雙端佇列,允許您從兩端新增或刪除元素,它提供了兩組用於新增和刪除元素的方法,一組在佇列的頭部,另一組在佇列的尾部deque
它可以用作佇列 (FIFO) 或堆疊 (lifo),用於deque
,可以在佇列的頭部使用addfirst()
offerfirst()
新增元素,使用removefirst()
pollfirst()
刪除元素; 在佇列的尾部使用addlast()
offerlast()
新增元素,使用removelast()
polllast()
刪除元素,如果嘗試從空的雙端佇列中刪除元素,則相關removexxx()
方法也被丟擲nosuchelementexception
而pollxxx()
方法返回null
queue
interface 和deque
介面之間的主要區別在於queue
該介面僅支援在一端新增元素,在另一端刪除元素deque
介面支援在兩端新增和刪除元素deque
該介面功能更強大,因為它可以用作佇列、堆疊或雙端佇列queue
介面只能用作佇列。
J**A 併發基礎知識:Deque 介面和 Queue 介面之間有什麼區別? - 程式設計師 Goode deque 介面代表乙個雙端佇列,雙端佇列是一種具有佇列和堆疊性質的資料結構,它允許從兩端插入和刪除元素,從而可以在佇列的前面(頭)或後面(尾部)新增或刪除元素,其主要功能包括:
1. 新增元素:
addfirst(e e)
offerfirst(e e)
:如果佇列已滿,則在佇列的頭部插入乙個元素addfirst
將被丟擲illegalstateexception
而offerfirst
然後返回false
addlast(e e)
offerlast(e e)
:如果佇列已滿,則在佇列末尾插入乙個元素addlast
將被丟擲illegalstateexception
而offerlast
然後返回false
。2. 刪除元素:
removefirst()
pollfirst()
:如果隊列為空,則從佇列的頭部刪除並返回元素removefirst
將被丟擲nosuchelementexception
而pollfirst
然後返回null
removelast()
polllast()
:如果隊列為空,則從佇列尾部刪除並返回元素removelast
將被丟擲nosuchelementexception
而polllast
然後返回null
。3. 檢查元素。
getfirst()
peekfirst()
:如果隊列為空,則獲取但不刪除佇列頭部的元素getfirst
將被丟擲nosuchelementexception
而peekfirst
然後返回null
getlast()
peeklast()
:如果隊列為空,則獲取但不刪除佇列尾部的元素getlast
將被丟擲nosuchelementexception
而peeklast
然後返回null
。deque 介面可用於多種場景,包括:
當需要可用作佇列 (FIFO) 或堆疊 (LIFO) 的資料結構時。 在需要高效地在兩端新增或刪除元素的場景,例如實現撤消重做功能、緩衝區管理等。 作為其他資料結構的底層實現,例如實現自定義堆疊或佇列。 下面是乙個如何使用 deque 介面的簡單示例,如下所示:
import j**a.util.deque;
import j**a.util.linkedlist;
public class dequeexample
輸出將為:
deque contents: [element 0 (head), element 1 (head), element 2 (tail)]
removed element from head: element 0 (head)
removed element from tail: element 2 (tail)
head element: element 1 (head)
deque is empty? false
在上面,它被使用了linkedlist
類作為deque
介面實現,因為linkedlist
類實現deque
介面,所以它提供了雙端佇列的所有操作,在佇列中新增一些元素,然後將它們從頭和尾部移除,並檢查佇列的 head 元素是否為空。
表示一種佇列資料結構,即一種特殊的線性表,它只允許在表的前端進行刪除操作,在表的後端(後方)進行插入操作,這種操作規則也被稱為“先進先出”(FIFO),其主要功能包括:
1. 插入元素:
add(e e)
:將指定的元素插入到此佇列中(如果它立即可行且不違反容量限制),並在成功時返回true
,如果當前沒有可用空間,則將其丟擲illegalstateexception
,雖然,在queue
介面實現,此方法通常不會引發異常,因為大多數佇列實現都是有界的,但邊界通常很大。 offer(e e)
:將指定的元素插入到此佇列中(如果它立即可行且不違反容量限制),並在成功時返回true
如果當前沒有可用空間,則返回false
。2. 刪除元素:
remove()
:刪除並返回此佇列的頭部,如果此隊列為空,則引發nosuchelementexception
poll()
:刪除並返回到此佇列的頭部,或返回null
如果此隊列為空。 3. 檢查元素。
element()
:檢索,但不刪除此佇列的頭部,如果此隊列為空,則丟擲它nosuchelementexception
peek()
:檢索,但不刪除此佇列的頭部,或返回null
如果此隊列為空。 使用場景
緩衝:當需要有序處理資料時,佇列可用作緩衝區,但不必一次處理所有資料,例如,列印任務佇列、網路請求佇列等。 生產者-消費者問題佇列通常用於協調多個執行緒之間的協作,尤其是在生產者-消費者場景中,生產者將產品放入佇列中,消費者將產品從佇列中取出進行消費。 廣度優先搜尋:在圖論中,佇列用於實現廣度優先搜尋 (BFS) 演算法。 事件驅動系統:佇列可用於儲存掛起的事件,例如使用者介面事件或系統事件。 這是乙個簡單的queue
介面使用示例,使用linkedlist
類作為實現,如下所示:
import j**a.util.linkedlist;
import j**a.util.queue;
public class queueexample
輸出:
initial queue: [apple, banana, cherry]
removed element: apple
queue after removal: [banana, cherry]
head of the queue: banana
iterating over the queue:
banana
cherry
在此示例中,乙個queue
用offer
方法插入多個元素,使用poll
方法刪除佇列的 header 元素並使用peek
方法檢視當前佇列的 head 元素,最後,使用增強的 for 迴圈遍歷佇列中的所有元素。
跟著我,每天學習網際網絡程式設計技術——程式設計師古德結束!