Java隊(duì)列(Queue)了解及使用

1.什么是隊(duì)列育勺?
隊(duì)列是數(shù)據(jù)結(jié)構(gòu)中比較重要的一種類型(是一種數(shù)據(jù)結(jié)構(gòu))但荤,它支持 FIFO罗岖,尾部添加、頭部刪除(先進(jìn)隊(duì)列的元素先出隊(duì)列)腹躁,跟我們生活中的排隊(duì)類似桑包。
2.什么情況下使用隊(duì)列?
一般情況下纺非,如果是對(duì)一些及時(shí)消息的處理哑了,并且處理時(shí)間很短的情況下是不需要隊(duì)列的,直接阻塞式的方法調(diào)用就可以了烧颖。但是如果在消息處理的時(shí)候特別費(fèi)時(shí)間弱左,這個(gè)時(shí)候如果有新消息來(lái)了,就只能處于阻塞狀態(tài)炕淮,造成用戶等待拆火。這個(gè)時(shí)候便需要引入隊(duì)列了。當(dāng)接收到消息后涂圆,先把消息房貸隊(duì)列中们镜,然后再用行的線程進(jìn)行處理,這個(gè)時(shí)候就不會(huì)有消息阻塞了润歉。
3.隊(duì)列介紹:
隊(duì)列有兩種:① 單隊(duì)列 : 就是常見(jiàn)的隊(duì)列模狭,每次添加元素時(shí),都是添加對(duì)隊(duì)尾踩衩。
② 循環(huán)隊(duì)列(暫不介紹)
4.隊(duì)列Queue
add 增加一個(gè)元索 如果隊(duì)列已滿嚼鹉,則拋出一個(gè)IIIegaISlabEepeplian異常
  remove 移除并返回隊(duì)列頭部的元素 如果隊(duì)列為空,則拋出一個(gè)NoSuchElementException異常
  element 返回隊(duì)列頭部的元素 如果隊(duì)列為空驱富,則拋出一個(gè)NoSuchElementException異常
  offer 添加一個(gè)元素并返回true 如果隊(duì)列已滿反砌,則返回false
  poll 移除并返問(wèn)隊(duì)列頭部的元素 如果隊(duì)列為空,則返回null
  peek 返回隊(duì)列頭部的元素 如果隊(duì)列為空萌朱,則返回null
  put 添加一個(gè)元素 如果隊(duì)列滿宴树,則阻塞
  take 移除并返回隊(duì)列頭部的元素 如果隊(duì)列為空,則阻塞

Java 集合中的 Queue 繼承自 Collection 接口 晶疼,Deque, LinkedList, PriorityQueue, BlockingQueue 等類都實(shí)現(xiàn)了它酒贬。

Queue 用來(lái)存放 等待處理元素 的集合,這種場(chǎng)景一般用于緩沖翠霍、并發(fā)訪問(wèn)锭吨。

除了繼承 Collection 接口的一些方法,Queue 還添加了額外的 添加寒匙、刪除零如、查詢操作躏将。

方法

添加、刪除考蕾、查詢這些個(gè)操作都提供了兩種形式祸憋,其中一種在操作失敗時(shí)直接拋出異常,而另一種則返回一個(gè)特殊的值:

方法

Queue 方法介紹:

1.add(E), offer(E) 在尾部添加:

boolean add(E e);

boolean offer(E e);

他們的共同之處是建議實(shí)現(xiàn)類禁止添加 null 元素肖卧,否則會(huì)報(bào)空指針 NullPointerException蚯窥;

不同之處在于 add() 方法在添加失敗(比如隊(duì)列已滿)時(shí)會(huì)報(bào) 一些運(yùn)行時(shí)錯(cuò)誤 錯(cuò)塞帐;而 offer() 方法即使在添加失敗時(shí)也不會(huì)奔潰拦赠,只會(huì)返回 false。

2016.11.21 添加

注意

Queue 是個(gè)接口葵姥,它提供的 add, offer 方法初衷是希望子類能夠禁止添加元素為 null荷鼠,這樣可以避免在查詢時(shí)返回 null 究竟是正確還是錯(cuò)誤。

事實(shí)上大多數(shù) Queue 的實(shí)現(xiàn)類的確響應(yīng)了 Queue 接口的規(guī)定榔幸,比如 ArrayBlockingQueue允乐,PriorityBlockingQueue 等等。

但還是有一些實(shí)現(xiàn)類沒(méi)有這樣要求牡辽,比如 LinkedList喳篇。

感謝 sumsear 指出。

2.remove(), poll() 刪除并返回頭部:

E remove();

E poll();

當(dāng)隊(duì)列為空時(shí) remove() 方法會(huì)報(bào) NoSuchElementException 錯(cuò); 而 poll() 不會(huì)奔潰态辛,只會(huì)返回 null麸澜。

3.element(), peek() 獲取但不刪除:

E element();

E peek();

當(dāng)隊(duì)列為空時(shí) element() 拋出異常;peek() 不會(huì)奔潰奏黑,只會(huì)返回 null炊邦。

其他

1.雖然 LinkedList 沒(méi)有禁止添加 null,但是一般情況下 Queue 的實(shí)現(xiàn)類都不允許添加 null 元素熟史,為啥呢馁害?因?yàn)?poll(), peek() 方法在異常的時(shí)候會(huì)返回 null,你添加了 null 以后蹂匹,當(dāng)獲取時(shí)不好分辨究竟是否正確返回碘菜。

2.Queue 一般都是 FIFO 的,但是也有例外限寞,比如優(yōu)先隊(duì)列 priority queue(它的順序是根據(jù)自然排序或者自定義 comparator 的)忍啸;再比如 LIFO 的隊(duì)列(跟棧一樣,后來(lái)進(jìn)去的先出去)履植。

不論進(jìn)入计雌、出去的先后順序是怎樣的,使用 remove()玫霎,poll() 方法操作的都是 頭部 的元素凿滤;而插入的位置則不一定是在隊(duì)尾了妈橄,不同的 queue 會(huì)有不同的插入邏輯。

5.代碼示例:

import java.util.LinkedList;
import java.util.Queue;

import org.junit.Before;
import org.junit.Test;

/**

  • 隊(duì)列測(cè)試:實(shí)現(xiàn)類使用LinkedList

  • Queue也有很多其他的實(shí)現(xiàn)類翁脆,比如java.util.concurrent.LinkedBlockingQueue眷蚓。

  • LinkedBlockingQueue是一個(gè)阻塞的線程安全的隊(duì)列,底層實(shí)現(xiàn)也是使用鏈?zhǔn)浇Y(jié)構(gòu)鹃祖。
    */
    public class TestQuene {

    // 定義一個(gè)隊(duì)列
    Queue<String> queue;

    @Before
    public void before() {
    // 實(shí)例化隊(duì)列變量
    queue = new LinkedList<String>();

     // add方法向隊(duì)列中添加元素,返回布爾值溪椎,add方法添加失敗時(shí)會(huì)拋異常,不推薦使用
     // queue.add("1");
     // queue.add("2");
     // queue.add("3");
     // queue.add("4");
     // queue.add("5");
    
     // offer方法向隊(duì)列中添加元素普舆,返回布爾值
     queue.offer("a");
     queue.offer("b");
     queue.offer("c");
     queue.offer("d");
     queue.offer("e");
    

    }

    // poll方法移除隊(duì)列首個(gè)元素并返回恬口,若隊(duì)列為空,返回null
    @Test
    public void test1() {
    // 彈出元素
    String pollEle = queue.poll(); // 先進(jìn)先出,彈出了a
    System.out.println(pollEle); // a
    System.out.println(queue); // [b, c, d, e]
    }

    // remove方法移除首個(gè)元素并返回,若隊(duì)列為空,會(huì)拋出異常:NoSuchElementException沼侣,不推薦使用
    @Test
    public void test2() {
    // 彈出元素
    String remove = queue.remove(); // 先進(jìn)先出,彈出了a
    System.out.println(remove); // a
    System.out.println(queue); // [b, c, d, e]
    }

    // peek方法返回隊(duì)列首個(gè)元素祖能,但不移除,若隊(duì)列為空蛾洛,返回null
    @Test
    public void test3() {
    // 查看首個(gè)元素
    String peek = queue.peek(); // 首個(gè)元素是a,最先加入
    System.out.println(peek); // a
    System.out.println(queue); // [a, b, c, d, e]
    }

    // element方法返回隊(duì)列的頭元素养铸,但不移除,若隊(duì)列為空轧膘,會(huì)拋出異常:NoSuchElementException钞螟,不推薦使用
    @Test
    public void test4() {
    // 查看首個(gè)元素
    String element = queue.element();
    System.out.println(element); // a
    System.out.println(queue); // [a, b, c, d, e]
    }

}


-->隊(duì)列的結(jié)合使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谎碍,隨后出現(xiàn)的幾起案子鳞滨,更是在濱河造成了極大的恐慌,老刑警劉巖蟆淀,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拯啦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡熔任,警方通過(guò)查閱死者的電腦和手機(jī)褒链,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疑苔,“玉大人甫匹,你說(shuō)我怎么就攤上這事〉敕眩” “怎么了兵迅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)趁餐。 經(jīng)常有香客問(wèn)我喷兼,道長(zhǎng),這世上最難降的妖魔是什么后雷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任季惯,我火速辦了婚禮吠各,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勉抓。我一直安慰自己贾漏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布藕筋。 她就那樣靜靜地躺著纵散,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隐圾。 梳的紋絲不亂的頭發(fā)上伍掀,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音暇藏,去河邊找鬼蜜笤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盐碱,可吹牛的內(nèi)容都是我干的把兔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瓮顽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼县好!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起暖混,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缕贡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后儒恋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體善绎,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年诫尽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了禀酱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牧嫉,死狀恐怖剂跟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酣藻,我是刑警寧澤曹洽,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站辽剧,受9級(jí)特大地震影響送淆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怕轿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一偷崩、第九天 我趴在偏房一處隱蔽的房頂上張望辟拷。 院中可真熱鬧,春花似錦阐斜、人聲如沸衫冻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)隅俘。三九已至,卻和暖如春笤喳,著一層夾襖步出監(jiān)牢的瞬間为居,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工莉测, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颜骤,地道東北人唧喉。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓捣卤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親八孝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子董朝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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