隊列:是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。
隊列的使用
Queue是一個實現(xiàn)Collection接口的接口。JDK自帶了很多實現(xiàn)類,比如LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue等。
Queue接口中比較常用的接口add(e)、offer(e)、poll()、peek()方法,add和offer方法的區(qū)別在于add失敗時會拋出異常,offer方法失敗返回false,有的實現(xiàn)類add方法直接調(diào)用offer方法。poll和peek的區(qū)別在于poll刪除第一個元素并返回,而peek直接返回第一個元素而不刪除。
一個簡單的例子:
優(yōu)先隊列(PriorityQueue)
PriorityQueue默認(rèn)通過一個小的頂堆實現(xiàn)優(yōu)先級隊列,也可以指定Comparator的優(yōu)先級來自定義實現(xiàn)隊列。
我們來看一個例子,隨機(jī)添加10個數(shù)字,我們?nèi)〕龅氖菑男〉酱蟮钠交取?br />
如果指定Comparator,則可以自定義優(yōu)先級,如下:
優(yōu)先隊列的實現(xiàn)原理
上面簡單說了,優(yōu)先級隊列底層通過堆實現(xiàn)優(yōu)先級,堆底層通過數(shù)組Object[]隊列實現(xiàn)。默認(rèn)容量為11,添加數(shù)據(jù)時如果容量不夠,會自動擴(kuò)容(如果容量小于64,則增加一倍,否則增加50%)。
添加元素時,它們將被放置在數(shù)組的末尾,然后浮動到適當(dāng)?shù)奈恢谩?br />
出隊的時候先刪除第一個元素,然后拿到最后一個元素,然后通過下沉的方法讓最后一個元素找到合適的位置,這樣數(shù)據(jù)結(jié)構(gòu)也可以保持完整的小頂堆或大頂堆。
java中的隊列類是隊列數(shù)據(jù)結(jié)構(gòu)管理類。其中的元素可以按照添加的順序刪除。
隊列通常(但不一定)以FIFO(先進(jìn)先出)的方式對元素進(jìn)行排序。例外情況是優(yōu)先級隊列,它根據(jù)提供的比較器或其自然順序?qū)υ剡M(jìn)行排序,以及LIFO隊列(或堆棧),它以LIFO(后進(jìn)先出)方式對元素進(jìn)行排序。無論使用哪種排序方法,隊列的頭部都是通過調(diào)用remove()或poll()刪除的元素。在FIFO隊列中,所有新元素都插入到隊列的末尾。其他類型的隊列可能使用不同的元素放置規(guī)則。每個Queue實現(xiàn)都必須指定其order屬性。
offer添加一個元素,如果隊列已滿則返回true,false
poll移除并返回隊列頭部的元素。如果隊列為空,則返回null
peek返回隊列頭部的元素,如果隊列為空則返回null
如果隊列已滿,put添加一個元素并阻塞
take移除并返回隊列頭部的元素,如果隊列為空則阻塞
element返回隊列頭部的元素如果隊列為空,則拋出NoSuchElementException
add如果隊列已滿,添加元素索引,拋出IIIegaISlabEepeplian異常
如果隊列為空,remove刪除并返回隊列頭部的元素,拋出一個
NoSuchElementException
注意:poll和peek方法在出錯時返回null。因此,在隊列中插入空值是不合法的。
還有帶有超時的offer和poll方法的重載,例如,下面的調(diào)用:
布爾成功=q.offer(x,100,TimeUnit.MILLISECONDS);
嘗試在100毫秒內(nèi)將元素插入隊列尾部。如果成功,立即返回true;否則,當(dāng)達(dá)到超時時,返回false。同樣,調(diào)用:
對象頭=q.poll(100,TimeUnit.MILLISECONDS);
如果在100毫秒內(nèi)成功移除隊列頭元素,則立即返回頭元素;否則,當(dāng)達(dá)到超時時,返回null。
阻塞操作是put和take。put方法在隊列滿時阻塞,而take方法在隊列為空時阻塞。
Queue接口與List和Set處于同一級別,都繼承了Collection接口。LinkedList實現(xiàn)了Queue接口。Queue接口縮小了對LinkedList方法的訪問權(quán)限(即如果方法中的參數(shù)類型為Queue,則只能訪問Queue接口定義的方法,不能直接訪問LinkedList的非Queue方法),以便只能使用適當(dāng)?shù)姆椒ālockingQueue繼承了Queue接口。
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號新時空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號