JAVA中的隊(duì)列(Queue)詳解
什么是隊(duì)列?
隊(duì)列是一種特殊的線(xiàn)性表,遵循先入先出、后入后出的基本原則,一般來(lái)說(shuō),它只允許在表的前端進(jìn)行刪除操作,而在表的后端進(jìn)行插入操作,但是java的某些隊(duì)列運(yùn)行在任何地方插入刪除;比如我們常用的 LinkedList 集合,它實(shí)現(xiàn)了Queue 接口,因此,我們可以理解為L(zhǎng)inkedList 就是一個(gè)隊(duì)列;
java隊(duì)列特性
隊(duì)列主要分為阻塞和非阻塞,有界和無(wú)界、單向鏈表和雙向鏈表之分;
阻塞和非阻塞
阻塞隊(duì)列
入列(添加元素)時(shí),如果元素?cái)?shù)量超過(guò)隊(duì)列總數(shù),會(huì)進(jìn)行等待(阻塞),待隊(duì)列的中的元素出列后,元素?cái)?shù)量未超過(guò)隊(duì)列總數(shù)時(shí),就會(huì)解除阻塞狀態(tài),進(jìn)而可以繼續(xù)入列;
出列(刪除元素)時(shí),如果隊(duì)列為空的情況下,也會(huì)進(jìn)行等待(阻塞),待隊(duì)列有值的時(shí)候即會(huì)解除阻塞狀態(tài),進(jìn)而繼續(xù)出列;
阻塞隊(duì)列的好處是可以防止隊(duì)列容器溢出;只要滿(mǎn)了就會(huì)進(jìn)行阻塞等待;也就不存在溢出的情況;
只要是阻塞隊(duì)列,都是線(xiàn)程安全的;
非阻塞隊(duì)列
不管出列還是入列,都不會(huì)進(jìn)行阻塞,
入列時(shí),如果元素?cái)?shù)量超過(guò)隊(duì)列總數(shù),則會(huì)拋出異常,
出列時(shí),如果隊(duì)列為空,則取出空值;
一般情況下,非阻塞式隊(duì)列使用的比較少,一般都用阻塞式的對(duì)象比較多;阻塞和非阻塞隊(duì)列在使用上的最大區(qū)別就是阻塞隊(duì)列提供了以下2個(gè)方法:
- 出隊(duì)阻塞方法 : take()
- 入隊(duì)阻塞方法 : put()
有界和無(wú)界
有界:有界限,大小長(zhǎng)度受限制
無(wú)界:無(wú)限大小,其實(shí)說(shuō)是無(wú)限大小,其實(shí)是有界限的,只不過(guò)超過(guò)界限時(shí)就會(huì)進(jìn)行擴(kuò)容,就行ArrayList 一樣,在內(nèi)部動(dòng)態(tài)擴(kuò)容
單向鏈表和雙向鏈表
單向鏈表 :每個(gè)元素中除了元素本身之外,還存儲(chǔ)一個(gè)指針,這個(gè)指針指向下一個(gè)元素;
雙向鏈表 :除了元素本身之外,還有兩個(gè)指針,一個(gè)指針指向前一個(gè)元素的地址,另一個(gè)指針指向后一個(gè)元素的地址;
java 隊(duì)列接口繼承圖
隊(duì)列常用方法
- add 增加一個(gè)元索 如果隊(duì)列已滿(mǎn),則拋出一個(gè)IIIegaISlabEepeplian異常
- remove 移除并返回隊(duì)列頭部的元素 如果隊(duì)列為空,則拋出一個(gè)NoSuchElementException異常
- element 返回隊(duì)列頭部的元素 如果隊(duì)列為空,則拋出一個(gè)NoSuchElementException異常
- offer 添加一個(gè)元素并返回true 如果隊(duì)列已滿(mǎn),則返回false
- poll 移除并返問(wèn)隊(duì)列頭部的元素 如果隊(duì)列為空,則返回null
- peek 返回隊(duì)列頭部的元素 如果隊(duì)列為空,則返回null
- put 添加一個(gè)元素 如果隊(duì)列滿(mǎn),則阻塞
- take 移除并返回隊(duì)列頭部的元素 如果隊(duì)列為空,則阻塞
- drainTo(list) 一次性取出隊(duì)列所有元素
知識(shí)點(diǎn): remove、element、offer、poll、peek其實(shí)是屬于Queue接口。
非阻塞隊(duì)列
1、ConcurrentLinkedQueue
單向鏈表結(jié)構(gòu)的無(wú)界并發(fā)隊(duì)列, 非阻塞隊(duì)列,由CAS實(shí)現(xiàn)線(xiàn)程安全,內(nèi)部基于節(jié)點(diǎn)實(shí)現(xiàn)
2、ConcurrentLinkedDeque
雙向鏈表結(jié)構(gòu)的無(wú)界并發(fā)隊(duì)列, 非阻塞隊(duì)列,由CAS實(shí)現(xiàn)線(xiàn)程安全
3、PriorityQueue
內(nèi)部基于數(shù)組實(shí)現(xiàn),線(xiàn)程不安全的隊(duì)列
阻塞隊(duì)列
1、DelayQueue
一個(gè)支持延時(shí)獲取元素的無(wú)界阻塞隊(duì)列
2、LinkedTransferQueue
一個(gè)由鏈表結(jié)構(gòu)組成的無(wú)界阻塞隊(duì)列。
3、ArrayBlockingQueue
有界隊(duì)列,阻塞式,初始化時(shí)必須指定隊(duì)列大小,且不可改變;,底層由數(shù)組實(shí)現(xiàn);
4、SynchronousQueue
最多只能存儲(chǔ)一個(gè)元素,每一個(gè)put操作必須等待一個(gè)take操作,否則不能繼續(xù)添加元素
5、PriorityBlockingQueue
一個(gè)帶優(yōu)先級(jí)的隊(duì)列,而不是先進(jìn)先出隊(duì)列。元素按優(yōu)先級(jí)順序被移除,而且它也是無(wú)界的,也就是沒(méi)有容量上限,雖然此隊(duì)列邏輯上是無(wú)界的,但是由于資源被耗盡,所以試圖執(zhí)行添加操作可能會(huì)導(dǎo)致 OutOfMemoryError 錯(cuò)誤;
到此這篇關(guān)于JAVA中的隊(duì)列(Queue)詳解的文章就介紹到這了,更多相關(guān)JAVA的隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java動(dòng)態(tài)批量生成logback日志文件的示例
本文主要介紹了Java動(dòng)態(tài)批量生成logback日志文件的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04Java中的StampedLock實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Java中的StampedLock實(shí)現(xiàn)原理詳解,ReentrantReadWriteLock采用悲觀讀,第一個(gè)讀線(xiàn)程拿到鎖后,第二個(gè)/第三個(gè)讀線(xiàn)程可以拿到鎖,特別是在讀線(xiàn)程很多,寫(xiě)線(xiàn)程很少時(shí),需要的朋友可以參考下2024-01-01SpringBoot項(xiàng)目中使用Sharding-JDBC實(shí)現(xiàn)讀寫(xiě)分離的詳細(xì)步驟
Sharding-JDBC是一個(gè)分布式數(shù)據(jù)庫(kù)中間件,它不僅支持?jǐn)?shù)據(jù)分片,還可以輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫(xiě)分離,本文介紹如何在Spring Boot項(xiàng)目中集成Sharding-JDBC并實(shí)現(xiàn)讀寫(xiě)分離的詳細(xì)步驟,需要的朋友可以參考下2024-08-08java中的常見(jiàn)幾種發(fā)送http請(qǐng)求實(shí)例
在Java編程中,發(fā)送HTTP請(qǐng)求是一個(gè)常見(jiàn)需求,常用的方法有四種:HttpURLConnection、URLConnection、HttpClient以及Socket,其中,使用HttpClient方式時(shí),需要添加額外的庫(kù)支持2024-11-11java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼
這篇文章主要介紹了java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01基于SpringBoot與Mybatis實(shí)現(xiàn)SpringMVC Web項(xiàng)目
這篇文章主要介紹了基于SpringBoot與Mybatis實(shí)現(xiàn)SpringMVC Web項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2017-04-04Java 將Excel轉(zhuǎn)為OFD格式(方法步驟)
OFD是一種開(kāi)放版式文檔是我國(guó)國(guó)家版式文檔格式標(biāo)準(zhǔn),本文通過(guò)Java后端程序代碼展示如何將Excel轉(zhuǎn)為OFD格式,分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2021-12-12mybatis-plus配置攔截器實(shí)現(xiàn)sql完整打印的代碼設(shè)計(jì)
在使用mybatis-plus(mybatis)的時(shí)候,往往需要打印完整的sql語(yǔ)句,然而輸出的日志不是很理想,因?yàn)閟ql語(yǔ)句中的關(guān)鍵字段信息都是用?來(lái)代替的,所以本文分享了一下自己寫(xiě)了一個(gè)攔截器實(shí)現(xiàn)了sql完整的打印,需要的朋友可以參考下2024-06-06