JAVA中的隊列(Queue)詳解
什么是隊列?
隊列是一種特殊的線性表,遵循先入先出、后入后出的基本原則,一般來說,它只允許在表的前端進行刪除操作,而在表的后端進行插入操作,但是java的某些隊列運行在任何地方插入刪除;比如我們常用的 LinkedList 集合,它實現了Queue 接口,因此,我們可以理解為LinkedList 就是一個隊列;

java隊列特性
隊列主要分為阻塞和非阻塞,有界和無界、單向鏈表和雙向鏈表之分;
阻塞和非阻塞
阻塞隊列
入列(添加元素)時,如果元素數量超過隊列總數,會進行等待(阻塞),待隊列的中的元素出列后,元素數量未超過隊列總數時,就會解除阻塞狀態(tài),進而可以繼續(xù)入列;
出列(刪除元素)時,如果隊列為空的情況下,也會進行等待(阻塞),待隊列有值的時候即會解除阻塞狀態(tài),進而繼續(xù)出列;
阻塞隊列的好處是可以防止隊列容器溢出;只要滿了就會進行阻塞等待;也就不存在溢出的情況;
只要是阻塞隊列,都是線程安全的;
非阻塞隊列
不管出列還是入列,都不會進行阻塞,
入列時,如果元素數量超過隊列總數,則會拋出異常,
出列時,如果隊列為空,則取出空值;
一般情況下,非阻塞式隊列使用的比較少,一般都用阻塞式的對象比較多;阻塞和非阻塞隊列在使用上的最大區(qū)別就是阻塞隊列提供了以下2個方法:
- 出隊阻塞方法 : take()
- 入隊阻塞方法 : put()
有界和無界
有界:有界限,大小長度受限制
無界:無限大小,其實說是無限大小,其實是有界限的,只不過超過界限時就會進行擴容,就行ArrayList 一樣,在內部動態(tài)擴容
單向鏈表和雙向鏈表
單向鏈表 :每個元素中除了元素本身之外,還存儲一個指針,這個指針指向下一個元素;

雙向鏈表 :除了元素本身之外,還有兩個指針,一個指針指向前一個元素的地址,另一個指針指向后一個元素的地址;

java 隊列接口繼承圖

隊列常用方法
- add 增加一個元索 如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常
- remove 移除并返回隊列頭部的元素 如果隊列為空,則拋出一個NoSuchElementException異常
- element 返回隊列頭部的元素 如果隊列為空,則拋出一個NoSuchElementException異常
- offer 添加一個元素并返回true 如果隊列已滿,則返回false
- poll 移除并返問隊列頭部的元素 如果隊列為空,則返回null
- peek 返回隊列頭部的元素 如果隊列為空,則返回null
- put 添加一個元素 如果隊列滿,則阻塞
- take 移除并返回隊列頭部的元素 如果隊列為空,則阻塞
- drainTo(list) 一次性取出隊列所有元素
知識點: remove、element、offer、poll、peek其實是屬于Queue接口。
非阻塞隊列
1、ConcurrentLinkedQueue
單向鏈表結構的無界并發(fā)隊列, 非阻塞隊列,由CAS實現線程安全,內部基于節(jié)點實現
2、ConcurrentLinkedDeque
雙向鏈表結構的無界并發(fā)隊列, 非阻塞隊列,由CAS實現線程安全
3、PriorityQueue
內部基于數組實現,線程不安全的隊列
阻塞隊列
1、DelayQueue
一個支持延時獲取元素的無界阻塞隊列
2、LinkedTransferQueue
一個由鏈表結構組成的無界阻塞隊列。
3、ArrayBlockingQueue
有界隊列,阻塞式,初始化時必須指定隊列大小,且不可改變;,底層由數組實現;
4、SynchronousQueue
最多只能存儲一個元素,每一個put操作必須等待一個take操作,否則不能繼續(xù)添加元素
5、PriorityBlockingQueue
一個帶優(yōu)先級的隊列,而不是先進先出隊列。元素按優(yōu)先級順序被移除,而且它也是無界的,也就是沒有容量上限,雖然此隊列邏輯上是無界的,但是由于資源被耗盡,所以試圖執(zhí)行添加操作可能會導致 OutOfMemoryError 錯誤;
到此這篇關于JAVA中的隊列(Queue)詳解的文章就介紹到這了,更多相關JAVA的隊列內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot項目中使用Sharding-JDBC實現讀寫分離的詳細步驟
Sharding-JDBC是一個分布式數據庫中間件,它不僅支持數據分片,還可以輕松實現數據庫的讀寫分離,本文介紹如何在Spring Boot項目中集成Sharding-JDBC并實現讀寫分離的詳細步驟,需要的朋友可以參考下2024-08-08
基于SpringBoot與Mybatis實現SpringMVC Web項目
這篇文章主要介紹了基于SpringBoot與Mybatis實現SpringMVC Web項目的相關資料,需要的朋友可以參考下2017-04-04
mybatis-plus配置攔截器實現sql完整打印的代碼設計
在使用mybatis-plus(mybatis)的時候,往往需要打印完整的sql語句,然而輸出的日志不是很理想,因為sql語句中的關鍵字段信息都是用?來代替的,所以本文分享了一下自己寫了一個攔截器實現了sql完整的打印,需要的朋友可以參考下2024-06-06

