[面試要點]Java中Queue的應用
Queue介面與List、Set同一級別,都是繼承了Collection介面。
佇列(queue)是一種常用的資料結構,可以將佇列看做是一種特殊的線性表,該結構遵循的先進先出原則。
Java中,LinkedList實現了Queue介面,因為LinkedList進行插入、刪除操作效率較高
相關常用方法:
boolean offer(E e):將元素追加到佇列末尾,若新增成功則返回true。
E poll():從隊首刪除並返回該元素。
E peek():返回隊首元素,但是不刪除
雙向佇列(Deque),是Queue的一個子介面,雙向佇列是指該佇列兩端的元素既能入隊(offer)也能出隊(poll),如果將Deque限制為只能從一端入隊和出隊,則可實現棧的資料結構。對於棧而言,有入棧(push)和出棧(pop),遵循先進後出原則
阻塞佇列
使用阻塞佇列兩個顯著的好處就是:多執行緒操作共同的佇列時不需要額外的同步,另外就是佇列會自動平衡負載,即那邊(生產與消費兩邊)處理快了就會被阻塞掉,從而減少兩邊的處理速度差距
BlockingQueue 介面的方法
BlockingQueue 具有 4 組不同的方法用於插入、移除以及對佇列中的元素進行檢查。如果請求的操作不能得到立即執行的話,每個方法的表現也不同。這些方法如下:
add 增加一個元索 如果佇列已滿,則丟擲一個IIIegaISlabEepeplian異常
remove 移除並返回佇列頭部的元素 如果佇列為空,則丟擲一個NoSuchElementException異常
element 返回佇列頭部的元素 如果佇列為空,則丟擲一個NoSuchElementException異常
offer 新增一個元素並返回true 如果佇列已滿,則返回false
poll 移除並返問佇列頭部的元素 如果佇列為空,則返回null
peek 返回佇列頭部的元素 如果佇列為空,則返回null
put 新增一個元素 如果佇列滿,則阻塞
take 移除並返回佇列頭部的元素 如果佇列為空,則阻塞
java.util.concurrent包提供了阻塞佇列的4個變種。預設情況下,LinkedBlockingQueue的容量是可指定的(在不指定時容量為Integer.MAX_VALUE),但是也可以選擇指定其最大容量,它是基於連結串列的佇列,此佇列按 FIFO(先進先出)排序元素。
ArrayBlockingQueue在構造時需要指定容量, 並可以選擇是否需要公平性,如果公平引數被設定true,等待時間最長的執行緒會優先得到處理(其實就是通過將ReentrantLock設定為true來 達到這種公平性的:即等待時間最長的執行緒會先操作)。通常,公平性會使你在效能上付出代價,只有在的確非常需要的時候再使用它。它是基於陣列的阻塞迴圈佇列,此佇列按 FIFO(先進先出)原則對元素進行排序。
PriorityBlockingQueue是一個帶優先順序的佇列,而不是先進先出佇列。元素按優先順序順序被移除,該佇列沒有上限(看了一下原始碼,PriorityBlockingQueue是對 PriorityQueue的再次包裝,是基於堆資料結構的,而PriorityQueue是沒有容量限制的,與ArrayList一樣,所以在優先阻塞佇列上put時是不會受阻的。雖然此佇列邏輯上是無界的,但是由於記憶體資源被耗盡,所以試圖執行新增操作可能會導致 OutOfMemoryError),但是如果佇列為空,那麼取元素的操作take就會阻塞,所以它的檢索操作take是受阻的。另外,往入該佇列中的元素要具有比較能力。
DelayQueue(基於PriorityQueue來實現的)是一個存放Delayed 元素的無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿後儲存時間最長的 Delayed 元素。如果延遲都還沒有期滿,則佇列沒有頭部,並且poll將返回null。當一個元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一個小於或等於零的值時,則出現期滿,poll就以移除這個元素了。此佇列不允許使用 null 元素。
相關推薦
[面試要點]Java中Queue的應用
Queue介面與List、Set同一級別,都是繼承了Collection介面。 佇列(queue)是一種常用的資料結構,可以將佇列看做是一種特殊的線性表,該結構遵循的先進先出原則。 Java中,LinkedList實現了Queue介面,因為LinkedL
JAVA面試要點003_Mybatis中#和$的區別
#的作用: userMapper.xml 注意這裡,寫sql語句,咱們可以使用xml配置的方式,也可以使用註解的方式. E:\workspace\day76_mybatis01\src\com\credream\test2\userMapper.xml <?xml v
java中JDBC應用示例實驗
int 數據 ktr col ack tor 操作數 成功 r文件 一、先下載mysql-connector-java-x.x.x-bin.jar包 下載mysql-connector-java-x.x.x-bin.jar,目前最新版為mysql-connector-ja
Bitmap在Java中的應用
一、40億資料排序問題 給定一個最多包含40億個隨機排列的32位整數的順序檔案,找出一個不在檔案中的32位整數(在檔案中至少缺失這樣一個數——為什麼?)。在具有足夠記憶體的情況下,如何解決該問題?(程式設計珠璣) 二、應用BitMap儲存大資料 資料的存在性可以使用bit位上的1或0來表
紅黑樹在Java中的應用
在Java中很多物件都使用了紅黑樹的資料結構,比如TreeMap,HashMap(1.8)等。然後我就想看看為什麼要使用這種資料結構? 要想了解紅黑樹,就先看看二叉查詢樹是什麼? 二叉查詢樹 二叉查詢樹(Binary Search Tree),也稱有序二叉樹(ordered binary tree),排序二叉
編輯距離矩陣及在java中的應用
剛好專案有需求要使用到,瞭解後覺得挺有意思的就發出來跟大家分享下,主要還是為了以後自己可以回頭翻翻,大神勿噴啊 下面開始進入正題: 一個原始字串,經過不斷的修改,刪除最後變成另外一個字串,怎麼體現出這個字串的修改痕跡呢,這裡面有個最小路徑的概念,也就是原始字串->目標
java中queue的使用
Queue介面與List、Set同一級別,都是繼承了Collection介面。LinkedList實現了Queue接 口。Queue介面窄化了對LinkedList的方法的訪問許可權(即在方法中的引數型別如果是Queue時,就完全只能訪問Queue介面所定義的
MD5在java中的應用
JDK內建了MD5的演算法,在java.security.*包中。應用的例子如下:package com.pn.bank.util;import java.security.NoSuchAlgorithmExceptio
Java中Queue類實現
原先在java程式設計中,Queue的實現都是用LinkedList Queue queue = new LinkedList(); 但正如jdk中所說的那樣: 注意,此實現不是同步的。如果多個執行緒同時訪問一個連結列表,而其中至少一個執行緒從結構上修改了該列表,則它必須
java中Queue
在併發佇列中JDK提供了兩種佇列:ConcurrentLinkedQueue:支援高效能的QueueBlockingQueue:帶阻塞的QueueConcurrentLinkedQueue是一種適用於高併發場景下的佇列,通過無鎖的方式,實現高併發狀態下的高效能,通常效能優於B
第一次面試(java 中equal和==的詳解)
今天去了方正國際軟體有限公司面試,第一次面試,面試之後的唯一想做的就是把基礎打好。來看看筆試的第一題 Long a1=128L; Long a2=128L; Long a3=127L; Long a4=127L; Sy
雙向加密演算法aes 在Java 中的應用
package com.noahgroup.paas.cicd.rest.apollo.test; import java.security.Key; import java.security.SecureRandom; import java.util.Base64; import jav
Java中Queue和Deque的介面說明
1. Queue: 1.1 基本概念 佇列(queue)是一種常用的資料結構,可以將佇列看做是一種特殊的線性表,該結構遵循的先進先出原則。Java中,LinkedList實現了Queue介面,因為LinkedList進行插入、刪除操作效率較高。 1.2 常
反射機制在java中的應用
本文主要介紹反射的一些基本概念,基本方法呼叫,和在java中的一些使用,主要是在模式中的使用如 工程模式,動態代理模式,dagger2,Butterknife 等也會用到 反射的基本概念 獲得class<?>的三種方法 Class<
關於正則表示式 基本語法 及java中的應用
一、^$ 表示開始和結束位置,如果需要提取文字不要加這個字元,除非你明白它們的意思。 二、“."表示除換行符外的所有字元, 但是 [.\n] 不能匹配上所有字元, 實際應用中可以使用如:[\s\S\] [\w\W] ....等等之類的 三、匹配二層括號:\\([\\s\\S
[面試要點]java io程式設計
java io 簡介 慣例先祭出一張圖 [1]輸入位元組流InputStream:InputStream 是所有的輸入位元組流的父類,它是一個抽象類;ByteArrayInputStream、StringBufferInputStream、FileInp
從同步原語看非阻塞同步以及Java中的應用
非阻塞同步:基於衝突檢測的樂觀併發策略,通俗講就是先進行操作,如果沒有其他執行緒爭用共享資料,那操作就成功了,如果爭用資料有衝突那就採用其他的補償措施(最常見的就是不斷重試直到成功),這種樂觀的併發策略使得很多執行緒不需要因為競爭失敗直接掛起,這種同步措施稱為非阻塞同步。下面我們就從硬體原語開始瞭解非阻塞
msquitto在java中的應用,一個小Demo
訊息釋出者 package com.gaofei.utils; import org.eclipse.paho.clien
Java多執行緒併發08——鎖在Java中的應用
>前兩篇文章中,為各位帶來了,鎖的型別及鎖在Java中的實現。接下來本文將為各位帶來鎖在Java中的應用相關知識。關注我的公眾號「Java面典」瞭解更多 Java 相關知識點。 鎖在Java中主要應用還是在JUC(java.util.concurrent)包下的相關類,常用的主要有原子類、原子集合以及阻塞佇
JAVA面試要點011---java中一個數的n次方怎麼寫
JAVA技術交流QQ群:170933152 第一步我們首先檢視一下Math數學函式的API,可以看到pow()方法返回第一個引數的第二個引數次方,格式為Math.pow(m,n),代表m的n次方,如下圖所示: