JAVA队列( Queue ) 详解
什么是隊列?
? ? ? 隊列是一種特殊的線性表,遵循先入先出、后入后出的基本原則,一般來說,它只允許在表的前端進行刪除操作,而在表的后端進行插入操作,但是java的某些隊列運行在任何地方插入刪除;比如我們常用的 LinkedList 集合,它實現了Queue 接口,因此,我們可以理解為?LinkedList 就是一個隊列;
java隊列特性
隊列主要分為阻塞和非阻塞,有界和無界、單向鏈表和雙向鏈表之分;
阻塞和非阻塞
阻塞隊列
? ? ? ? ??入列(添加元素)時,如果元素數量超過隊列總數,會進行等待(阻塞),待隊列的中的元素出列后,元素數量未超過隊列總數時,就會解除阻塞狀態,進而可以繼續入列;
?? ? ? ? ?出列(刪除元素)時,如果隊列為空的情況下,也會進行等待(阻塞),待隊列有值的時候即會解除阻塞狀態,進而繼續出列;
? ? ? ? ? 阻塞隊列的好處是可以防止隊列容器溢出;只要滿了就會進行阻塞等待;也就不存在溢出的情況;
? ? ? ? ? 只要是阻塞隊列,都是線程安全的;
? ? ? ? ??
非阻塞隊列
? ? ? ? ? 不管出列還是入列,都不會進行阻塞,
?? ??? ???入列時,如果元素數量超過隊列總數,則會拋出異常,
? ? ? ? ? 出列時,如果隊列為空,則取出空值;
一般情況下,非阻塞式隊列使用的比較少,一般都用阻塞式的對象比較多;阻塞和非阻塞隊列在使用上的最大區別就是阻塞隊列提供了以下2個方法:
- ? ? 出隊阻塞方法 :?take()
- ? ? 入隊阻塞方法 : put()
有界和無界
?? ?有界:有界限,大小長度受限制
?? ?無界:無限大小,其實說是無限大小,其實是有界限的,只不過超過界限時就會進行擴容,就行ArrayList 一樣,在內部動態擴容
? ?
單向鏈表和雙向鏈表
單向鏈表 :?每個元素中除了元素本身之外,還存儲一個指針,這個指針指向下一個元素;
雙向鏈表 :除了元素本身之外,還有兩個指針,一個指針指向前一個元素的地址,另一個指針指向后一個元素的地址;
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
? 單向鏈表結構的無界并發隊列, 非阻塞隊列,由CAS實現線程安全,內部基于節點實現
2、ConcurrentLinkedDeque ?
雙向鏈表結構的無界并發隊列, 非阻塞隊列,由CAS實現線程安全? ??
3、PriorityQueue
內部基于數組實現,線程不安全的隊列
阻塞隊列
1、DelayQueue
一個支持延時獲取元素的無界阻塞隊列
2、LinkedTransferQueue
一個由鏈表結構組成的無界阻塞隊列。
3、ArrayBlockingQueue
有界隊列,阻塞式,初始化時必須指定隊列大小,且不可改變;,底層由數組實現;
4、SynchronousQueue
最多只能存儲一個元素,每一個put操作必須等待一個take操作,否則不能繼續添加元素
5、PriorityBlockingQueue
一個帶優先級的隊列,而不是先進先出隊列。元素按優先級順序被移除,而且它也是無界的,也就是沒有容量上限,雖然此隊列邏輯上是無界的,但是由于資源被耗盡,所以試圖執行添加操作可能會導致 OutOfMemoryError 錯誤;
總結
以上是生活随笔為你收集整理的JAVA队列( Queue ) 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复旦计算机学硕上岸,复旦大学工程与应用技
- 下一篇: lua 5.3.5 使用pairs遍历t