欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA中的隊列(Queue)詳解

 更新時間:2023年07月25日 08:49:32   作者:java葉新東老師  
這篇文章主要介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java動態(tài)批量生成logback日志文件的示例

    Java動態(tài)批量生成logback日志文件的示例

    本文主要介紹了Java動態(tài)批量生成logback日志文件的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • Java中的StampedLock實現原理詳解

    Java中的StampedLock實現原理詳解

    這篇文章主要介紹了Java中的StampedLock實現原理詳解,ReentrantReadWriteLock采用悲觀讀,第一個讀線程拿到鎖后,第二個/第三個讀線程可以拿到鎖,特別是在讀線程很多,寫線程很少時,需要的朋友可以參考下
    2024-01-01
  • SpringBoot項目中使用Sharding-JDBC實現讀寫分離的詳細步驟

    SpringBoot項目中使用Sharding-JDBC實現讀寫分離的詳細步驟

    Sharding-JDBC是一個分布式數據庫中間件,它不僅支持數據分片,還可以輕松實現數據庫的讀寫分離,本文介紹如何在Spring Boot項目中集成Sharding-JDBC并實現讀寫分離的詳細步驟,需要的朋友可以參考下
    2024-08-08
  • java檢查服務器的連通兩種方法代碼分享

    java檢查服務器的連通兩種方法代碼分享

    這篇文章主要介紹了java檢查服務器的連通兩種方法代碼分享,涉及ping的介紹以及檢查服務器連通的兩種方法代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • java中的常見幾種發(fā)送http請求實例

    java中的常見幾種發(fā)送http請求實例

    在Java編程中,發(fā)送HTTP請求是一個常見需求,常用的方法有四種:HttpURLConnection、URLConnection、HttpClient以及Socket,其中,使用HttpClient方式時,需要添加額外的庫支持
    2024-11-11
  • java實現波雷費密碼算法示例代碼

    java實現波雷費密碼算法示例代碼

    這篇文章主要介紹了java實現波雷費密碼算法示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 基于SpringBoot與Mybatis實現SpringMVC Web項目

    基于SpringBoot與Mybatis實現SpringMVC Web項目

    這篇文章主要介紹了基于SpringBoot與Mybatis實現SpringMVC Web項目的相關資料,需要的朋友可以參考下
    2017-04-04
  • 基于MyBatis XML配置方法(全面了解)

    基于MyBatis XML配置方法(全面了解)

    下面小編就為大家?guī)硪黄贛yBatis XML配置方法(全面了解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java 將Excel轉為OFD格式(方法步驟)

    Java 將Excel轉為OFD格式(方法步驟)

    OFD是一種開放版式文檔是我國國家版式文檔格式標準,本文通過Java后端程序代碼展示如何將Excel轉為OFD格式,分步驟給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2021-12-12
  • mybatis-plus配置攔截器實現sql完整打印的代碼設計

    mybatis-plus配置攔截器實現sql完整打印的代碼設計

    在使用mybatis-plus(mybatis)的時候,往往需要打印完整的sql語句,然而輸出的日志不是很理想,因為sql語句中的關鍵字段信息都是用?來代替的,所以本文分享了一下自己寫了一個攔截器實現了sql完整的打印,需要的朋友可以參考下
    2024-06-06

最新評論