摘要:最小初始化容量。它作為堆棧隊(duì)列雙端隊(duì)列的操作和的操作是一致的,只是內(nèi)部的實(shí)現(xiàn)不同。根據(jù)元素內(nèi)容查找和刪除的效率比較低,為。但是接口有對(duì)應(yīng)的并發(fā)實(shí)現(xiàn)類類。
Queue接口的實(shí)現(xiàn)類
Queue接口作為隊(duì)列數(shù)據(jù)結(jié)構(gòu),java在實(shí)現(xiàn)的時(shí)候,直接定義了Deque接口(雙端隊(duì)列)來(lái)繼承Queue接口,并且只實(shí)現(xiàn)Deque接口。這樣java中的雙端隊(duì)列就囊括了隊(duì)列、雙端隊(duì)列、堆棧(Deque接口又定義了Stack的操作方法)這3種角色的功能。
所以我們?cè)谑褂玫臅r(shí)候直接使用的是Deque接口的實(shí)現(xiàn)類,當(dāng)然Deque接口繼承自Queue接口。
Deque接口的實(shí)現(xiàn)類我們記住,Deque接口所能代表的數(shù)據(jù)結(jié)構(gòu):隊(duì)列,雙端隊(duì)列,堆棧。
ArrayDeque1.內(nèi)部使用transient Object[] elements數(shù)組來(lái)實(shí)現(xiàn)。擁有head/tail這2個(gè)頭尾指針。最小初始化容量8。它還是一個(gè)循環(huán)隊(duì)列。
2.在擴(kuò)容/初始化的時(shí)候,數(shù)組的內(nèi)部大小一定是2個(gè)冪次方,也就是說(shuō)大小只可能是:8、16、32、64這樣的倍增。
3.它作為堆棧、隊(duì)列、雙端隊(duì)列的操作和LinkedList的操作是一致的,只是內(nèi)部的實(shí)現(xiàn)不同。當(dāng)然,它們也有區(qū)別。
ArrayDeque實(shí)現(xiàn)了雙端隊(duì)列,內(nèi)部使用循環(huán)數(shù)組實(shí)現(xiàn),這決定了它有如下特點(diǎn):
在兩端添加、刪除元素的效率很高,動(dòng)態(tài)擴(kuò)展需要的內(nèi)存分配以及數(shù)組拷貝開(kāi)銷可以被平攤,具體來(lái)說(shuō),添加N個(gè)元素的效率為O(N)。
根據(jù)元素內(nèi)容查找和刪除的效率比較低,為O(N)。
與ArrayList和LinkedList不同,沒(méi)有索引位置的概念,不能根據(jù)索引位置進(jìn)行操作(無(wú)法隨機(jī)訪問(wèn),這也符合隊(duì)列的性質(zhì))。
4.操作示例,要記住,Deque具有3種數(shù)據(jù)結(jié)構(gòu)的特性,不同的數(shù)據(jù)結(jié)構(gòu)應(yīng)該使用不同的語(yǔ)義化方法!
LinkedListLinkedList中在“List有序集合”這一篇文章中講過(guò)了,從隊(duì)列和雙端隊(duì)列的角度來(lái)看,LinkedList和ArrayDeque的方法聲明都是一致的。只不過(guò)LinkedList較之于ArrayDeque多實(shí)現(xiàn)了List接口,還具有有序集合List的特性。
ArrayDeque和LinkedList的比較ArrayDeque和LinkedList都實(shí)現(xiàn)了Deque接口,應(yīng)該用哪一個(gè)呢?如果只需要Deque接口,從兩端進(jìn)行操作,一般而言,ArrayDeque效率更高一些,應(yīng)該被優(yōu)先使用。不過(guò),如果同時(shí)需要根據(jù)索引位置進(jìn)行操作,或者經(jīng)常需要在中間進(jìn)行插入和刪除,則應(yīng)該選LinkedList(注意,這里使用的是List特性,而不是Deque特性了)。
PriorityQueue有一個(gè)直接實(shí)現(xiàn)了Queue接口的類,但是它并不是真正意義上的隊(duì)列,而是一個(gè)優(yōu)先隊(duì)列!
PriorityQueue保存元素的順序并不是按照加入的順序,而是根據(jù)元素的大?。▽?shí)現(xiàn)Comparable接口或提供Comparator類)來(lái)決定元素在Queue隊(duì)列中的順序。默認(rèn)情況如果我們存入String對(duì)象,則是按降序排列。
可以看到,優(yōu)先隊(duì)列的默認(rèn)大小為11,內(nèi)部使用Object[]數(shù)組來(lái)實(shí)現(xiàn)隊(duì)列結(jié)構(gòu)。
對(duì)于擴(kuò)容操作,可以看到。如果當(dāng)前容量小于64,則容量增加2;如果當(dāng)前容量大于等于64,則變?yōu)樵瓉?lái)的1.5倍。
講講Queue/Deque對(duì)應(yīng)的并發(fā)類PriorityQueue優(yōu)先隊(duì)列沒(méi)有對(duì)應(yīng)的并發(fā)類。但是Queue接口有對(duì)應(yīng)的并發(fā)實(shí)現(xiàn)類:java.util.concurrent.ConcurrentLinkedQueue類。
Deque接口有對(duì)應(yīng)的并發(fā)實(shí)現(xiàn)類:java.util.concurrent.ConcurrentLinkedDeque類。
Collection集合下的Queue/Deque從類圖來(lái)看,實(shí)現(xiàn)了Queue接口的類就是PriorityQueue,但要注意它是優(yōu)先隊(duì)列!實(shí)現(xiàn)了Deque接口的類有ArrayDeque和LinkedList,2者的內(nèi)部實(shí)現(xiàn)不同,一個(gè)是數(shù)組,另一個(gè)是鏈表。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/77270.html
摘要:會(huì)死循環(huán),因?yàn)闂?nèi)不會(huì)彈出所以判斷會(huì)一直執(zhí)行。集合用于模擬隊(duì)列這種數(shù)據(jù)結(jié)構(gòu),隊(duì)列通常是指先進(jìn)先出的容器。集合不僅提供了的功能,還提供了雙端隊(duì)列,棧的功能。如果有多個(gè)線程需要訪問(wèn)集合中的元素,需要考慮使用將幾個(gè)包裝成線程安全集合。 List判斷兩個(gè)對(duì)象相等只通過(guò)equals方法比較返回true即可。 public class A { @Override public ...
摘要:除此之外,還有一個(gè)接口,代表一個(gè)雙端隊(duì)列,雙端隊(duì)列可以同時(shí)從兩端刪除添加元素,因此的實(shí)現(xiàn)類既可當(dāng)成隊(duì)列使用,也可當(dāng)成棧使用。相當(dāng)于棧方法將一個(gè)元素進(jìn)該雙端隊(duì)列所表示的棧的棧頂。 Queue用于模擬隊(duì)列這種數(shù)據(jù)結(jié)構(gòu),隊(duì)列通常是指先進(jìn)先出(FIFO)的容器。隊(duì)列的頭部保存在隊(duì)列中存放時(shí)間最長(zhǎng)的元素,隊(duì)列的尾部保存在隊(duì)列中存放時(shí)間最短的元素。新元素插入(offer)到隊(duì)列的尾部,訪問(wèn)元素(p...
摘要:棧隊(duì)列雙端隊(duì)列都是非常經(jīng)典的數(shù)據(jù)結(jié)構(gòu)。結(jié)合了棧和隊(duì)列的特點(diǎn)。因此,在中,有棧的使用需求時(shí),使用代替。迭代器之前源碼源碼之與字段中分析過(guò),容器的實(shí)現(xiàn)中,所有修改過(guò)容器結(jié)構(gòu)的操作都需要修改字段。 棧、隊(duì)列、雙端隊(duì)列都是非常經(jīng)典的數(shù)據(jù)結(jié)構(gòu)。和鏈表、數(shù)組不同,這三種數(shù)據(jù)結(jié)構(gòu)的抽象層次更高。它只描述了數(shù)據(jù)結(jié)構(gòu)有哪些行為,而并不關(guān)心數(shù)據(jù)結(jié)構(gòu)內(nèi)部用何種思路、方式去組織。本篇博文重點(diǎn)關(guān)注這三種數(shù)據(jù)結(jié)構(gòu)...
摘要:底層使用的是雙向鏈表數(shù)據(jù)結(jié)構(gòu)之前為循環(huán)鏈表,取消了循環(huán)??焖匐S機(jī)訪問(wèn)就是通過(guò)元素的序號(hào)快速獲取元素對(duì)象對(duì)應(yīng)于方法。而接口就是用來(lái)標(biāo)識(shí)該類支持快速隨機(jī)訪問(wèn)。僅僅是起標(biāo)識(shí)作用。,中文名為雙端隊(duì)列。不同的是,是線程安全的,內(nèi)部使用了進(jìn)行同步。 前言 學(xué)習(xí)情況記錄 時(shí)間:week 2 SMART子目標(biāo) :Java 容器 記錄在學(xué)習(xí)Java容器 知識(shí)點(diǎn)中,關(guān)于List的需要重點(diǎn)記錄的知識(shí)點(diǎn)。...
摘要:隊(duì)列中有元素時(shí),就說(shuō)明有過(guò)期了,線程繼續(xù)執(zhí)行,然后元素出隊(duì),根據(jù)相應(yīng)的移除緩存。所以嚴(yán)格來(lái)說(shuō),雖然實(shí)現(xiàn)了隊(duì)列接口,但是它的目的卻并不是隊(duì)列,而是將生產(chǎn)者消費(fèi)者線程配對(duì)。轉(zhuǎn)移隊(duì)列鏈?zhǔn)睫D(zhuǎn)移隊(duì)列。 引言 本周在編寫(xiě)短信驗(yàn)證碼頻率限制切面的時(shí)候,經(jīng)潘老師給的實(shí)現(xiàn)思路,使用隊(duì)列進(jìn)行實(shí)現(xiàn)。 看了看java.util包下的Queue接口,發(fā)現(xiàn)還從來(lái)沒(méi)用過(guò)呢! Collection集合類接口,由它派生...
閱讀 4722·2021-10-25 09:48
閱讀 3291·2021-09-07 09:59
閱讀 2352·2021-09-06 15:01
閱讀 2795·2021-09-02 15:21
閱讀 2774·2019-08-30 14:14
閱讀 2258·2019-08-29 13:59
閱讀 2578·2019-08-29 11:02
閱讀 2592·2019-08-26 13:33