Java中常用隊列的總結

2020-12-06 凱哥Java

Java隊列總結

通過前面文章的學習,我們對Java中常用隊列做了介紹。本文,咱們來對隊列做個總結吧。

首先,我們介紹了現實生活中的實際場景(排隊買票等),來告訴我們為什麼需要使用隊列。

隊列是一種先進先出(FIFO)的抽象數據結構,在Java中,隊列使用了兩種數據類型來實現的,分別是:數組和鍊表這兩種數據結構。

本文主要內容:回顧Java中常用的七個阻塞隊列進行總結及阻塞隊列中四組AP並進行總結。

本文來源:本文是由凱哥Java(kaigejava)原創發布。

接著,我們介紹了隊列的分類,可以分為兩類,即阻塞隊列和非阻塞隊列。

常用的三個非阻塞隊列:LinkedList、PriorityQueue和ConcurrentLinkedQueue.

(PS:凱哥沒有做介紹,在以後的文章中,凱哥將對ConcurrentLinkedQueue進行介紹)

然後我們介紹Java中常用的七個阻塞隊列。他們之間類圖關係:

我們可以看到,隊列是Collection的子類。也即和arrayList類似的。

接著我們就對七個阻塞隊列做了詳細的介紹。

阻塞隊列的七個子類

ArrayBlockingQueue(下文簡稱:ABQueue)、LinkedBlockingQueue(下文簡稱:LBQueue)、PriorityBlockingQueue(下文簡稱:PBQueue)、DelayQueue(下文簡稱:DQueue)、SynchronouseQueue(下文簡稱:SyncQueue)、LinkedTrnsferQueue(下文簡稱:LTQueue)、LinkedBlockingDeque(下文簡稱:LBDeque)這個七個。

來分別說說每個隊列的特點:

ABQueue:

底層使用的是數組結構。因為數組需要初始化大小,所以其構造器需要輸入隊列的大小。

是有界的阻塞安全隊列(思考:為什麼說是有界的?是怎麼保證線程安全的?),默認是不保證線程的公平性(思考:為什麼默認不能保證線程公平?如何保證線程安全?),不允許向隊列中插入null元素。

LBQueue:

「有界」的阻塞安全隊列,其底層使用的是鍊表的數據結構。所謂的「有界」是因為,默認隊列的大小是Integer.MAX_VALUE。這個數值等於21億+。因為這個數據太大了,也可以理解為無界的。不建議使用默認值,最好在初始化的時候,指定隊列的大小。

PBQueue:

是一個支持優先級的無界隊列。支持優先級是因為使用了comparator這個接口。默認採用字典升序排序策略的。如果不想使用默認的,在初始化的時候,還可以自定義比較器的。

以上三個隊列相關更詳細的介紹,歡迎回看《Java中常用的七個阻塞隊列介紹第一篇》。在這篇文章中,凱哥對這三個隊列做了詳細的介紹以及代碼演示。

DQueue:

是一個支持優先級的無界阻塞隊列。支持優先級是應該底層使用的是PriorityQueue隊列來實現的。而PriorityQueue隊列在添加元素的時候使用了siftUpComparable方法。這個對了的一個特點:支持延時獲取。所以,這個隊列可以運用在緩存系統的設計中。當從隊列中獲取到數據,說明延時時間到了。

關於DQueue更多詳細的介紹,歡迎回看:《Java中常用的七個阻塞隊列第二篇DelayQueue源碼介紹》。在這篇文章中,凱哥做了詳細的介紹,同時使用代碼模擬了緩存數據到期操作。

SyncQueue:

是一個無存儲空間的阻塞同步隊列。不存儲元素的原因是因為,一個put操作必須等待一個take操作與之對應才可以。否則就不能繼續添加元素了。默認使用非公平的。在性能上SyncQueue隊列的吞吐量比LBqueu和ABQueue的性能高。

LTQueue:是由鍊表組成的無界隊列。比其他隊列多了兩個方法:tryTransfer、transfer

LBDeque:鍊表組成的雙端隊列。這個隊列在以後凱哥講For/Join框架的時候,還會說到。

七個阻塞隊列的小總結:

接著,我們講解了隊列中常用的四組API。

阻塞隊列四組API

會拋異常的:添加元素使用add(e),刪除元素使用remove,檢查隊首元素使用的element.

當隊列滿的時候,在向隊列中添加元素會拋出異常;當隊列為空的時候在從隊列中刪除或者是獲取隊首元素都會拋出異常;

帶有返回值的:添加元素:offer(e),刪除元素:poll(),檢查隊首元素:peek().

當隊列滿的時候,再調用offer(e)向隊列中添加元素會返回false而不是拋出異常

當隊列為空的時候,調用take()或者是peek()方法返回null而不是拋出異常

阻塞一直等待的:添加元素:put(e),刪除元素:take()

當隊列滿的時候,再向隊列中添加元素,隊列會進入阻塞狀態,直到元素添加成功為止。

當隊列為空的時候,再從隊列刪除元素,隊列會阻塞,直到能夠刪除元素為止。

帶有超時時間的阻塞:添加元素:offer(e,time,unit),刪除元素:poll(time,unit)

當隊列滿的時候,調用offer(e,time,unit)會進入阻塞等待中,當過來超時時間,退出等待

當隊列為空的時候,調用poll(time,unit)方法會進入等待狀態,當到了超時時間,會退出等待。

四組API總結:

關於四組API更詳細的介紹歡迎學習:《Java阻塞隊列的四組API》。在這篇文章中凱哥做了詳細的介紹。用人的一生四個階段來比擬這四組API。

到此,我們已經把Java中隊列介紹完畢。接下來,凱哥將帶著大家一起學習線程池。歡迎大家繼續學習。

相關焦點

  • java中的Queue隊列的用法
    大家好,歡迎來到雄雄的小課堂,今天給大家分享的是「java中的Queue隊列的用法」 前言:好多人對Queue不是很熟悉,畢竟平時也不怎麼用,遇到集合要麼List要麼map這些常用的,殊不知,java中還有個Queue,今天,我們就來看看Queue的用法。
  • java中的Queue隊列的用法
    大家好,歡迎來到雄雄的小課堂,今天給大家分享的是「java中的Queue隊列的用法」 前言:好多人對Queue不是很熟悉,畢竟平時也不怎麼用,遇到集合要麼List要麼map這些常用的,殊不知,java中還有個Queue,今天,我們就來看看Queue的用法。
  • JAVA基礎學習|JAVA中的包總結!
    Java語言類庫中幾個常用的包  1.java.lang包。
  • Java基礎總結,聽說3小時可入門!
    2,導入包中全部對象: import java.util.5,標點符號Java 中常用的標點符號用法總結如下()表示優先級或者函數參數列表[]用於索引或數組聲明{}用於作用域&maven搜索並載入依賴的順序如下:本地倉庫->私人遠程倉庫->中央倉庫常見的maven 命令如下:六,Java數據結構概述Java中常用的數據結構主要包括字符串(String),數組(Array),枚舉(enum), 以及java.util中的各種容器類(通常被稱做集合)。
  • Java中的字符串常用方法
    public char charAt(int index): 獲取指定索引位置的字符public int indexOf(int ch): 返回指定字符在此字符串中第一次出現處的索引。public int indexOf(String str): 返回指定字符串在此字符串中第一次出現處的索引。public int indexOf(int ch,int fromIndex):返回指定字符在此字符串中從指定位置後第一次出現處的索引。
  • 2020學習Java必看的3本書籍
    《Effective Java》本書一共包含90個條目,每個條目討論Java程序設計中的一條規則。這些規則反映了最有經驗的優秀程式設計師在實踐中常用的一些有益的做法。本書的目標是幫助讀者更加有效地使用Java程式語言及其基本類庫:java.lang、java.util和java.io,以及子包,如java.util.concurrent和java.util.function。本書時不時地也會討論其他的類庫。3.
  • 數據結構與算法之環形隊列
    #數據結構與算法上一節中關於隊列存在一個問題,隊列是一次性隊列,其實也是數組只用了一次,無法再次往隊列中添加數據,這是數組實現隊列的bug,所以在這一節會解決這個bug,採用環形隊列的形式解決。,這裡做一下總結:front指針表示隊首,並且控制出隊;rear指針表示隊尾的後一個位置,並且表示入隊;隊列長度為L時,隊列可以存儲的有效數據為L-1,因為空出一個空間作為約定,並且這個空間在不斷的變化。
  • 一起學JAVA——常用類
    java提供了很多已經封裝好的類供開發者使用,掌握一些常用類可以大大提高開發效率。Object類Object類被成為超類、根類、頂級父類或上帝類。因為,Object類是所有類的父類,除Object本身外,所有java類都必須直接或間接的繼承java.lang.Object類。由於所有的類都繼承在Object類,因此可以省略extends Object關鍵字。
  • 用兩個棧實現隊列(劍指 Offer 題解Java版)
    分析棧的特點是先進後出,而隊列的特點是先進先出,主要就是在兩個棧中來回倒騰從而實現隊列的功能,就好像一個黑盒子,裡邊是兩個棧的操作,但其他人在用這個黑盒子的時候,感覺就像在用隊列一樣。隊列和棧只是邏輯性的數據結構,實現隊列和棧可以用數組實現,也可以用鍊表實現,只要滿足隊列先進先出,棧先進後出的特性就可以。
  • java常用幾大類庫
    ArrayList 中可不斷添加元素,其大小也自動增長。4.3 ArrayList使用步驟查看類java.util.ArrayList <E> :該類需要 import導入後使用。常用的方法有:public boolean add(E e) :將指定的元素添加到此集合的尾部。public E remove(int index) :移除此集合中指定位置上的元素。返回被刪除的元素。public E get(int index) :返回此集合中指定位置上的元素。返回獲取的元素。
  • java四大引用詳解!
    ,如果軟引用被gc回收,jvm就會把軟引用加入到隊列中。gc不內存是發現弱引用,就會立刻回收弱引用對象,但是我們知道gc是一個優先級很低的線程,所以不一定立刻發現並回收弱引用對象,但記住,只要被gc發現弱引用,不管內存夠不夠,直接回收,同時,弱引用,也可以結合隊列使用,當被回收,就進去於之關聯的隊列中代碼public class
  • Java進階之路——從初級程式設計師到架構師,從小工到專家 ...
    下面幾篇文章從思想到實現,為你梳理出常用的數據結構和經典算法。1-1 常用數據結構數組、鍊表、堆、棧、隊列、Hash表、二叉樹等1-2 算法思想算法時間複雜度和空間複雜度的分析計算算法思想:遞推、遞歸、窮舉、貪心、分治、動態規劃、迭代、分枝界限1-3 經典算法經典排序:插入排序、冒泡排序、快排(分劃交換排序)、直接選擇排序、堆排序、合併排序經典查找:
  • RabbitMQ 消費端限流、TTL、死信隊列
    RabbitMQ支持隊列的過期時間,從消息入隊列開始計算,只要超過了隊列的超時時間配置,那麼消息會自動的清除。這與 Redis 中的過期時間概念類似。我們應該合理使用 TTL 技術,可以有效的處理過期垃圾消息,從而降低伺服器的負載,最大化的發揮伺服器的性能。
  • Java深入解讀-並發容器之BlockingQueue
    內容導讀最常用的" 生產者-消費者 "問題中,隊列通常被視作線程間操作的數據容器,這樣,可以對各個模塊的業務功能進行解耦,生產者將「生產」出來的數據放置在數據容器中,而消費者僅僅只需要在「數據容器」中進行獲取數據即可,這樣生產者線程和消費者線程就能夠進行解耦,只專注於自己的業務功能即可。
  • 「原創」Java並發編程系列29|ConcurrentLinkedQueue
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫J.U.C 為常用的集合提供了並發安全的版本,前面講解了 map 的並發安全集合 ConcurrentHashMap,List 並發安全集合 CopyOnWriteArrayList,Set 並發安全集合
  • 詳解SpringCloud中RabbitMQ消息隊列原理及配置,一篇就夠!
    Producer發送消息到RabbitMQ中,MQ中的Direct交換器接受到消息後,會根據Routing Key來決定這個消息要發送到哪一個隊列中。Consumer則負責註冊一個隊列監聽器,來監聽隊列的狀態,當隊列狀態發生變化時,消費消息。註冊隊列監聽需要提供交換器信息,隊列信息和路由鍵信息。這種交換器通常用於點對點消息傳輸的業務模型中。如電子郵箱。
  • Java基礎面試題簡單總結
    中的保留字,現在沒有在java中使用11、數組有沒有length()這個方法?48、一個".java"源文件中是否可以包括多個類(不是內部類)?有什麼限制? 答:可以。必須只有一個類名與文件名相同。49、java中有幾種類型的流?
  • 結合JAVA詳解鍊表、棧、隊列等數據結構
    總結順序表最大的特點是:查詢快,因為是數組,直接下標出。插入和移除就比較慢了。這些方法中的每一種都有兩種形式:如果操作失敗,則拋出一個異常,另一種返回一個特殊值(null或false,具體取決於操作)。
  • java常用幾大類庫
    ArrayList 中可不斷添加元素,其大小也自動增長。4.3 ArrayList使用步驟查看類java.util.ArrayList <E> :該類需要 import導入後使用。常用的方法有:public boolean add(E e) :將指定的元素添加到此集合的尾部。public E remove(int index) :移除此集合中指定位置上的元素。返回被刪除的元素。public E get(int index) :返回此集合中指定位置上的元素。返回獲取的元素。
  • 2.Java基礎知識-常用dos命令
    2.1 打開控制臺win + R,然後cmd回車2.2 常用命令d: 回車 盤符切換;cd\cls: (clear screen)清屏exit: 退出dos命令行創作不易,點讚或關注我後面持續更新從java基礎到java項目實踐有相關問題可以在評論區提出