Java—Queue隊(duì)列詳解(Deque/PriorityQueue/Deque/ArrayDeque/LinkedList)

Queue

Queue隊(duì)列介紹

??Queue是用于模擬隊(duì)列的蝶桶,啥叫隊(duì)列?隊(duì)列就是排隊(duì)的意思掉冶,比如排隊(duì)結(jié)賬真竖,先進(jìn)入隊(duì)伍中脐雪,先排到先付賬走人;后排到的恢共,進(jìn)入隊(duì)伍战秋,等前面的人出隊(duì)伍后,再跟在后面付錢出隊(duì)讨韭。符合“先進(jìn)先出FIFO”的規(guī)則脂信,是一種線性表。插入在一端透硝,刪除則在另一端狰闪。入隊(duì)(offer)在隊(duì)尾,出隊(duì)(poll)在隊(duì)頭濒生。
??Queue接口有實(shí)現(xiàn)類PriorityQueue埋泵,有另一個雙端隊(duì)列接口Deque。

Queue隊(duì)列進(jìn)出示意圖

隊(duì)列進(jìn)出示意圖

Queue常用方法

??PriorityQueue擁有QueueCollection的方法罪治。下面主要介紹一些常用方法:

  • boolean add(E e);:將指定元素加入到隊(duì)列的尾部秋泄。
  • E element();:獲取隊(duì)列頭部的元素,但是不刪除該元素规阀。
  • boolean offer(E e);:將指定元素加入到隊(duì)列的尾部。
  • E peek();:獲取隊(duì)列頭部的元素瘦麸,但是不刪除元素谁撼;若隊(duì)列為空,返回null滋饲。
  • E poll();:獲取隊(duì)列頭部的元素厉碟,并刪除該元素。若隊(duì)列為空屠缭,返回null箍鼓。
  • E remove();:獲取隊(duì)列頭部的元素,并刪除該元素呵曹。若隊(duì)列為空款咖,拋異常。

PriorityQueue

PriorityQueue概述

??PriorityQueue是Queue隊(duì)列實(shí)現(xiàn)類奄喂,PriorityQueue保存隊(duì)列元素的順序不是按照加入隊(duì)列的順序铐殃,而是按照隊(duì)列元素的大小進(jìn)行重新排序。當(dāng)調(diào)用peek()或者poll()方法獲取隊(duì)列元素時(shí)跨新,獲取的是隊(duì)列最小元素富腊,而不是先入隊(duì)列的元素。有點(diǎn)反先入先出規(guī)則域帐。

PriorityQueue示例

1)運(yùn)行主類:

public class DemoApplication {

    public static void main(String[] args) {

        PriorityQueue priorityQueue = new PriorityQueue();
        priorityQueue.offer(5);
        priorityQueue.offer(-1);
        priorityQueue.offer(3);
        priorityQueue.offer(7);

        //查看入隊(duì)順序
        System.out.println("隊(duì)列輸出:" + priorityQueue);

        //peek方法獲取隊(duì)頭元素但是不刪除元素
        System.out.println("peek()方法獲取隊(duì)頭:" + priorityQueue.peek());

        //查看第一個元素即為最小元素
        System.out.println("第一個隊(duì)列元素出隊(duì):" + priorityQueue.poll());
        System.out.println("第二個隊(duì)列元素出隊(duì):" + priorityQueue.poll());
        System.out.println("第三個隊(duì)列元素出隊(duì):" + priorityQueue.poll());
        System.out.println("第四個隊(duì)列元素出隊(duì):" + priorityQueue.poll());
        System.out.println("null隊(duì)列:" + priorityQueue.poll());
        
    }

}

2)運(yùn)行結(jié)果:

隊(duì)列輸出:[-1, 5, 3, 7]
peek()方法獲取隊(duì)頭:-1
第一個隊(duì)列元素出隊(duì):-1
第二個隊(duì)列元素出隊(duì):3
第三個隊(duì)列元素出隊(duì):5
第四個隊(duì)列元素出隊(duì):7
null隊(duì)列:null

Deque

Deque雙端隊(duì)列介紹

??Deque是Queue子接口赘被,是雙端隊(duì)列是整。可以同時(shí)從兩端(隊(duì)列頭部和尾部)添加民假、刪除元素浮入。所以可以用來實(shí)現(xiàn)棧的數(shù)據(jù)結(jié)構(gòu)。有兩個實(shí)現(xiàn)類(ArrayDequeLinkedList

Deque常用方法

  • void addFirst(E e):將指定元素插入該雙端隊(duì)列的頭部阳欲,比較重要舵盈,下面很多方法頭部插入內(nèi)部實(shí)現(xiàn)都是通過這個來實(shí)現(xiàn)的,如offerFirst()球化。
  • void addLast(E e):將指定元素插入該雙端隊(duì)列的尾部秽晚。比較重要,下面添加到尾部插入內(nèi)部實(shí)現(xiàn)都是通過這個來實(shí)現(xiàn)的筒愚,如offerLast()赴蝇。
  • E getFirst():獲取但不刪除雙端隊(duì)列的第一個元素。
  • E getLast():獲取但不刪除雙端隊(duì)列的最后一個元素巢掺。
  • E removeFirst():獲取并刪除該雙端隊(duì)列的第一個元素句伶。棧的出隊(duì)列方法pop()也是通過該方法實(shí)現(xiàn)的。
  • E removeLast():獲取并刪除該雙端隊(duì)列的最后一個元素陆淀。
  • Iterator<E> descendingIterator():返回雙端隊(duì)列的迭代器考余,逆向順序迭代元素轧苫。
  • boolean offerFirst(E e):將指定元素插入該雙端隊(duì)列的頭部。
    public boolean offerFirst(E e) {
        addFirst(e);
        return true;
    }
  • boolean offerLast(E e):將指定元素插入該雙端隊(duì)列的尾部含懊。
    public boolean offerLast(E e) {
        addLast(e);
        return true;
    }
  • E peekFirst():獲取但不刪除該雙端隊(duì)列的第一個元素;若隊(duì)列為空岔乔,則返回null酥筝。
    public E peekFirst() {
        final Node<E> f = first;
        return (f == null) ? null : f.item;
     }
  • E peekLast():獲取但不刪除該雙端隊(duì)列的最后一個元素;若隊(duì)列為空嘿歌,則返回null剿配。
    public E peekLast() {
        final Node<E> l = last;
        return (l == null) ? null : l.item;
    }
  • E pollFirst():獲取并刪除該雙端隊(duì)列的第一個元素搅幅;若隊(duì)列為空,則返回null呼胚。
    public E pollFirst() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
    }
  • E pollLast():獲取并刪除該雙端隊(duì)列的最后一個元素茄唐;若隊(duì)列為空,則返回null沪编。
    public E pollLast() {
        final Node<E> l = last;
        return (l == null) ? null : unlinkLast(l);
    }
  • E pop():棧方法,pop出該雙端隊(duì)列表示棧的棧頂元素访圃,等價(jià)于removeFirst()方法相嵌。
    public E pop() {
        return removeFirst();
    }
  • void push(E e):棧方法,push元素進(jìn)入該雙端隊(duì)列表示棧的棧頂饭宾,等價(jià)于addFist()方法。
    public void push(E e) {
        addFirst(e);
    }
  • boolean removeFirstOccurrence(Object o):刪除該雙端隊(duì)列的第一次出現(xiàn)的元素o看铆,底層通過remove()方法實(shí)現(xiàn)。
    public boolean removeFirstOccurrence(Object o) {
        return remove(o);
    }
  • boolean removeLastOccurrence(Object o):刪除該涮短隊(duì)列的最后一次出現(xiàn)的元素o否淤。

ArrayDeque

ArrayDeque概述

??ArrayDeque底層實(shí)現(xiàn)類似于ArrayList棠隐,都是通過動態(tài)、可分配的Object[]數(shù)組來實(shí)現(xiàn)元素存儲助泽,當(dāng)集合元素超過數(shù)組容量,會重新分配一個新的數(shù)組來存儲集合元素。

ArrayDeque示例

1)運(yùn)行主類

public class DemoApplication {
    public static void main(String[] args) {
        //可以作為棧來使用挖藏,先進(jìn)后出
        ArrayDeque<String> arrayDeque = new ArrayDeque<>();
        arrayDeque.push("book01");
        arrayDeque.push("book03");
        arrayDeque.push("book02");
        arrayDeque.push("book04");

        System.out.println("原棧:" + arrayDeque);

        System.out.println("獲取頭部元素,但不刪除該元素岩臣,peek(): " + arrayDeque.peek());
        System.out.println("獲取頭部元素宵膨,且刪除該元素,pop(): " +arrayDeque.pop());
        System.out.println("獲取第一個元素辟躏,但不刪除:" + arrayDeque.getFirst());
        System.out.println("獲取最后一個元素,但不刪除:" + arrayDeque.getLast());

        System.out.println("在雙端隊(duì)列頭部插入元素:" + arrayDeque.offerFirst("booknew01"));
        System.out.println("在雙端隊(duì)列尾部插入元素:" + arrayDeque.offerLast("booknew02"));
        System.out.println("新棧:" + arrayDeque);

    }

}

2)運(yùn)行結(jié)果

原棧:[book04, book02, book03, book01]
獲取頭部元素会涎,但不刪除該元素: book04
獲取頭部元素,且刪除該元素: book04
獲取第一個元素末秃,但不刪除:book02
獲取最后一個元素,但不刪除:book01
true
true
新棧:[booknew01, book02, book03, book01, booknew02]

LinkedList

LinkedList概述

??LinkedList實(shí)現(xiàn)List练慕,同時(shí)也實(shí)現(xiàn)了Deque,可以當(dāng)做雙端隊(duì)列來使用项鬼,可以當(dāng)做“楐锶”或“隊(duì)列”使用。
??LinkedList與ArrayList哪工、ArrayDeque不同之處在于底層實(shí)現(xiàn),LinkedList底層是通過鏈表的形式存儲元素雁比,隨機(jī)訪問性能比較差稚虎,但是在插入偎捎、刪除的時(shí)候性能比較好(只需要改變指針?biāo)傅牡刂肪托校?/p>

Q&A

peek()和element()的異同

  • 同:peek()和element()都是在不移除的情況下返回隊(duì)頭茴她;
  • 異:peek()方法在隊(duì)列為空時(shí)返回null,而element()會拋出NoSuchElementException異常丈牢。

poll()和remove()的異同

  • 同:poll()和remove()都是將移除并返回隊(duì)頭;
  • 異:poll()在隊(duì)列為空時(shí)返回null慌核,而remove()會拋出NoSuchElementException異常申尼。

隊(duì)列和棧區(qū)別?

隊(duì)列

  1. 隊(duì)列是按照先進(jìn)先出FIFO原則進(jìn)行操作元素的师幕。
  2. 隊(duì)列是限定所有的插入只能在表的一端進(jìn)行,而刪除在表的另一端進(jìn)行的線性表钾怔。
  3. 表中允許插入的一端為隊(duì)尾,允許刪除的一端為隊(duì)頭宗侦。

  1. 棧是一種特殊的線性表,是一種后進(jìn)先出LIFO的結(jié)構(gòu)姑裂;
  2. 棧是先定僅在表尾插入和刪除運(yùn)算的線性表男旗,表尾即為棧頂,表頭稱為棧底察皇。
  3. 棧的物理存儲可以用熟悉順序存儲結(jié)構(gòu),也可以用鏈?zhǔn)酱鎯Y(jié)構(gòu)矾缓。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稻爬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子琉雳,更是在濱河造成了極大的恐慌友瘤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锯茄,死亡現(xiàn)場離奇詭異茶没,居然都是意外死亡晚碾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門笛求,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人探入,你說我怎么就攤上這事∶缦ィ” “怎么了植旧?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長病附。 經(jīng)常有香客問我,道長域庇,這世上最難降的妖魔是什么覆积? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮写穴,結(jié)果婚禮上雌贱,老公的妹妹穿的比我還像新娘。我一直安慰自己欣孤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布篷朵。 她就那樣靜靜地躺著婆排,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腮猖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天澈缺,我揣著相機(jī)與錄音,去河邊找鬼莱预。 笑死项滑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杖们。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼姥饰,長吁一口氣:“原來是場噩夢啊……” “哼孝治!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岂座,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤杭措,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸳址,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泉懦,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年巡球,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邓嘹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡矿筝,死狀恐怖鲸阻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸟悴,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布沛贪,位于F島的核電站震贵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏猩系。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一塘偎、第九天 我趴在偏房一處隱蔽的房頂上張望拿霉。 院中可真熱鬧,春花似錦绽淘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至熏矿,卻和暖如春离钝,著一層夾襖步出監(jiān)牢的瞬間票编,已是汗流浹背卵渴。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工浪读, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辛藻,地道東北人互订。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像仰禽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子规揪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容