日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA队列( Queue ) 详解

發布時間:2023/12/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 ) 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。