摘要:知識點(diǎn)總結(jié)容器知識點(diǎn)總結(jié)容器接口與是在同一級別,都是繼承了接口。另一種隊(duì)列則是雙端隊(duì)列,支持在頭尾兩端插入和移除元素,主要包括。一個(gè)由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。是一個(gè)阻塞的線程安全的隊(duì)列,底層實(shí)現(xiàn)也是使用鏈?zhǔn)浇Y(jié)構(gòu)。
Java知識點(diǎn)總結(jié)(Java容器-Queue)
@(Java知識點(diǎn)總結(jié))[Java, Java容器]
QueueQueue接口與List、Set是在同一級別,都是繼承了Collection接口。LinkedList接口實(shí)現(xiàn)了Queue接口。Queue接口收縮了對LinkedList的方法訪問權(quán)限(也就是方法參數(shù)如果是Queue,那就只能方法Queue接口定義的方法),讓方法能夠正確的使用。
隊(duì)列隊(duì)列是一種數(shù)據(jù)結(jié)構(gòu),它有兩個(gè)基本操作:在隊(duì)列尾部添加一個(gè)元素,和在隊(duì)列頭部移除一個(gè)元素。也就是說,隊(duì)列以一種先進(jìn)先出(FIFO)的方式操作數(shù)據(jù)。
隊(duì)列,它主要分為兩大類,一類是阻塞式隊(duì)列,隊(duì)列滿了以后再插入元素則會(huì)拋出異常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另一種隊(duì)列則是雙端隊(duì)列,支持在頭、尾兩端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。
方法 | 功能 | 異常處理 |
---|---|---|
add | 增加一個(gè)元索 | 如果隊(duì)列已滿,則拋出一個(gè)IIIegaISlabEepeplian異常 |
remove | 移除并返回隊(duì)列頭部的元素 | 如果隊(duì)列為空,則拋出一個(gè)NoSuchElementException異常 |
element | 返回隊(duì)列頭部的元素 | 如果隊(duì)列為空,則拋出一個(gè)NoSuchElementException異常 |
offer | 添加一個(gè)元素并返回true | 如果隊(duì)列已滿,則返回false |
poll | 移除并返問隊(duì)列頭部的元素 | 如果隊(duì)列為空,則返回null |
peek | 返回隊(duì)列頭部的元素 | 如果隊(duì)列為空,則返回null |
put | 添加一個(gè)元素 | 如果隊(duì)列滿,則阻塞 |
take | 移除并返回隊(duì)列頭部的元素 | 如果隊(duì)列為空,則阻塞 |
拋出異常:是指當(dāng)阻塞隊(duì)列滿時(shí)候,再往隊(duì)列里插入元素,會(huì)拋出IllegalStateException(“Queue full”)異常。當(dāng)隊(duì)列為空時(shí),從隊(duì)列里獲取元素時(shí)會(huì)拋出NoSuchElementException異常 。
返回特殊值:插入方法會(huì)返回是否成功,成功則返回true。移除方法,則是從隊(duì)列里拿出一個(gè)元素,如果沒有則返回null
一直阻塞:當(dāng)阻塞隊(duì)列滿時(shí),如果生產(chǎn)者線程往隊(duì)列里put元素,隊(duì)列會(huì)一直阻塞生產(chǎn)者線程,直到拿到數(shù)據(jù),或者響應(yīng)* 中斷退出。當(dāng)隊(duì)列空時(shí),消費(fèi)者線程試圖從隊(duì)列里take元素,隊(duì)列也會(huì)阻塞消費(fèi)者線程,直到隊(duì)列可用。
超時(shí)退出:當(dāng)阻塞隊(duì)列滿時(shí),隊(duì)列會(huì)阻塞生產(chǎn)者線程一段時(shí)間,如果超過一定的時(shí)間,生產(chǎn)者線程就會(huì)退出。
阻塞隊(duì)列ArrayBlockingQueue :一個(gè)由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列。
LinkedBlockingQueue :一個(gè)由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列。
PriorityBlockingQueue :一個(gè)支持優(yōu)先級排序的無界阻塞隊(duì)列。
DelayQueue:一個(gè)使用優(yōu)先級隊(duì)列實(shí)現(xiàn)的無界阻塞隊(duì)列。
SynchronousQueue:一個(gè)不存儲元素的阻塞隊(duì)列。
LinkedTransferQueue:一個(gè)由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。
LinkedBlockingDeque:一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列。
ConcurrentLinkedQueue :基于鏈接節(jié)點(diǎn)的無界線程安全隊(duì)列
Queue的使用/** * 隊(duì)列測試:實(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ì)列 Queuequeue; @Before public void before() { // 實(shí)例化隊(duì)列變量 queue = new LinkedList (); // 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] } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71420.html
摘要:底層使用的是雙向鏈表數(shù)據(jù)結(jié)構(gòu)之前為循環(huán)鏈表,取消了循環(huán)。快速隨機(jī)訪問就是通過元素的序號快速獲取元素對象對應(yīng)于方法。而接口就是用來標(biāo)識該類支持快速隨機(jī)訪問。僅僅是起標(biāo)識作用。,中文名為雙端隊(duì)列。不同的是,是線程安全的,內(nèi)部使用了進(jìn)行同步。 前言 學(xué)習(xí)情況記錄 時(shí)間:week 2 SMART子目標(biāo) :Java 容器 記錄在學(xué)習(xí)Java容器 知識點(diǎn)中,關(guān)于List的需要重點(diǎn)記錄的知識點(diǎn)。...
摘要:線程安全的線程安全的,在讀多寫少的場合性能非常好,遠(yuǎn)遠(yuǎn)好于高效的并發(fā)隊(duì)列,使用鏈表實(shí)現(xiàn)。這樣帶來的好處是在高并發(fā)的情況下,你會(huì)需要一個(gè)全局鎖來保證整個(gè)平衡樹的線程安全。 該文已加入開源項(xiàng)目:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項(xiàng)目,Star 數(shù)接近 14 k)。地址:https://github.com/Snailclimb... 一 JDK ...
摘要:說到復(fù)盤基礎(chǔ),并不是所有的都會(huì)復(fù)盤,沒那個(gè)時(shí)間更沒那個(gè)必要。比如,一些基礎(chǔ)的語法以及條件語句,極度簡單。思前想后,我覺得整個(gè)計(jì)劃應(yīng)該從集合開始,而復(fù)盤的方式就是讀源碼。通常,隊(duì)列不允許隨機(jī)訪問隊(duì)列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學(xué)轉(zhuǎn)行...
摘要:同步容器及其注意事項(xiàng)中的容器主要可以分為四個(gè)大類,分別是和,但并不是所有的容器都是線程安全的。并發(fā)容器及其注意事項(xiàng)在版本之前所謂的線程安全的容器,主要指的就是同步容器,當(dāng)然因?yàn)樗蟹椒ǘ加脕肀WC互斥,串行度太高了,性能太差了。 Java 并發(fā)包有很大一部分內(nèi)容都是關(guān)于并發(fā)容器的,因此學(xué)習(xí)和搞懂這部分的內(nèi)容很有必要。 Java 1.5 之前提供的同步容器雖然也能保證線程安全,但是性能很差...
摘要:本文主要講述消息服務(wù)在中的使用。所以需要一個(gè)監(jiān)聽容器工廠的概念,即接口,它會(huì)引用上面創(chuàng)建好的與的連接工廠,由它來負(fù)責(zé)接收消息以及將消息分發(fā)給指定的監(jiān)聽器。為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)。 JMS 在 SpringBoot 中的使用 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請保留出處:https://github.com/jasonGeng88/blog> 本文所有服務(wù)均采用doc...
閱讀 3014·2021-11-16 11:42
閱讀 3651·2021-09-08 09:36
閱讀 950·2019-08-30 12:52
閱讀 2481·2019-08-29 14:12
閱讀 769·2019-08-29 13:53
閱讀 3583·2019-08-29 12:16
閱讀 644·2019-08-29 12:12
閱讀 2469·2019-08-29 11:16