解析Java中的隊(duì)列和用LinkedList集合模擬隊(duì)列的方法
API中對(duì)隊(duì)列的說(shuō)明:
public interface Queue<E> extends Collection<E>
在處理元素前用于保存元素的 collection。除了基本的 Collection 操作外,隊(duì)列還提供其他的插入、提取和檢查操作。每個(gè)方法都存在兩種形式:一種拋出異常(操作失敗時(shí)),另一種返回一個(gè)特殊值(null 或 false,具體取決于操作)。插入操作的后一種形式是用于專(zhuān)門(mén)為有容量限制的 Queue 實(shí)現(xiàn)設(shè)計(jì)的;在大多數(shù)實(shí)現(xiàn)中,插入操作不會(huì)失敗。
隊(duì)列通常(但并非一定)以 FIFO(先進(jìn)先出)的方式排序各個(gè)元素。不過(guò)優(yōu)先級(jí)隊(duì)列和 LIFO 隊(duì)列(或堆棧)例外,前者根據(jù)提供的比較器或元素的自然順序?qū)υ剡M(jìn)行排序,后者按 LIFO(后進(jìn)先出)的方式對(duì)元素進(jìn)行排序。無(wú)論使用哪種排序方式,隊(duì)列的頭 都是調(diào)用 remove() 或 poll() 所移除的元素。在 FIFO 隊(duì)列中,所有的新元素都插入隊(duì)列的末尾。其他種類(lèi)的隊(duì)列可能使用不同的元素放置規(guī)則。每個(gè) Queue 實(shí)現(xiàn)必須指定其順序?qū)傩浴?br />
如果可能,offer 方法可插入一個(gè)元素,否則返回 false。這與 Collection.add 方法不同,該方法只能通過(guò)拋出未經(jīng)檢查的異常使添加元素失敗。offer 方法設(shè)計(jì)用于正常的失敗情況,而不是出現(xiàn)異常的情況,例如在容量固定(有界)的隊(duì)列中。
remove() 和 poll() 方法可移除和返回隊(duì)列的頭。到底從隊(duì)列中移除哪個(gè)元素是隊(duì)列排序策略的功能,而該策略在各種實(shí)現(xiàn)中是不同的。remove() 和 poll() 方法僅在隊(duì)列為空時(shí)其行為有所不同:remove() 方法拋出一個(gè)異常,而 poll() 方法則返回 null。
element() 和 peek() 返回,但不移除,隊(duì)列的頭。
Queue 接口并未定義阻塞隊(duì)列的方法,而這在并發(fā)編程中是很常見(jiàn)的。BlockingQueue 接口定義了那些等待元素出現(xiàn)或等待隊(duì)列中有可用空間的方法,這些方法擴(kuò)展了此接口。
Queue 實(shí)現(xiàn)通常不允許插入 null 元素,盡管某些實(shí)現(xiàn)(如 LinkedList)并不禁止插入 null。即使在允許 null 的實(shí)現(xiàn)中,也不應(yīng)該將 null 插入到 Queue 中,因?yàn)?null 也用作 poll 方法的一個(gè)特殊返回值,表明隊(duì)列不包含元素。
Queue 實(shí)現(xiàn)通常未定義 equals 和 hashCode 方法的基于元素的版本,而是從 Object 類(lèi)繼承了基于身份的版本,因?yàn)閷?duì)于具有相同元素但有不同排序?qū)傩缘年?duì)列而言,基于元素的相等性并非總是定義良好的。
在java里使用隊(duì)列可以用LinkedList集合進(jìn)行模擬
方法
使用LinkedList集合,并使用其中的addLast、removeFirst、isEmpty等API集體模擬隊(duì)列操作
入隊(duì)列
void addLast(E e); // 將元素插入此列表的結(jié)尾
出隊(duì)列
E removeFirst(); // 移除并返回列表的第一個(gè)元素
判空
boolean isEmpty(); // 判斷隊(duì)列是否為空
示例代碼
package coreJavaOne; import java.util.LinkedList; import java.util.NoSuchElementException; public class SimulateQueue { private LinkedList<Integer> queue = new LinkedList<Integer>(); public boolean isEmpty() { return this.queue.isEmpty(); } public void enQueue(int data) { this.queue.addLast(data); } public int deQueue() throws NoSuchElementException { return this.queue.removeFirst(); } public static void main(String[] args) { SimulateQueue q = new SimulateQueue(); q.enQueue(1); q.enQueue(2); q.enQueue(3); while (! q.isEmpty()) { int data = q.deQueue(); System.out.println(data); } } }
相關(guān)文章
SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼
本篇文章主要介紹了SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02Springboot+Thymeleaf+Jpa實(shí)現(xiàn)登錄功能(附源碼)
最近有學(xué)習(xí)到關(guān)于Springboot+Thymeleaf+Jpa的綜合運(yùn)用知識(shí),因此想寫(xiě)一個(gè)簡(jiǎn)單的登錄界面來(lái)嘗試一下,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05利用Java+OpenCV實(shí)現(xiàn)拍照功能
網(wǎng)上大多是利用C語(yǔ)言或者Python實(shí)現(xiàn)拍照功能,本文將為大家介紹另一種方法,即在Java中調(diào)用OpenCV實(shí)現(xiàn)拍照功能,感興趣的可以了解一下2022-01-01java圖片和文本同時(shí)提交到表單的實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于java實(shí)現(xiàn)圖片和文本同時(shí)提交到表單的相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-02-02淺析Spring?Cloud?Gateway中的令牌桶限流算法
這篇文章主要為大家淺析了Spring?Cloud?Gateway中的令牌桶限流算法原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02Java的springcloud Sentinel是什么你知道嗎
這篇文章主要介紹了Java之springcloud Sentinel案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08