隊列是一種特殊的線性表。
只允許在表的前端進行刪除操作,在表的後端進行插入操作。
1.普通隊列
舉例:
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
//add()和remove()方法在失敗的時候會拋出異常(不推薦)
Queue<String> queue = new LinkedList<String>();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("poll="+queue.poll()); //返回第一個元素,並在隊列中刪除
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("element="+queue.element()); //返回第一個元素
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("peek="+queue.peek()); //返回第一個元素
for(String q : queue){
System.out.println(q);
}
}
}
2.阻塞隊列(應用於多線程場景):
阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。這兩個附加的操作支持阻塞的插入和移除方法
1)支持阻塞的插入方法:意思是當隊列滿時,隊列會阻塞插入元素的線程,直到隊列不滿。
2)支持阻塞的移除方法:意思是在隊列爲空時,獲取元素的線程會等待隊列變爲非空
JDK 7 提供了7個阻塞隊列,如下
1、ArrayBlockingQueue 數組結構組成的有界阻塞隊列。
此隊列按照先進先出(FIFO)的原則對元素進行排序,但是默認情況下不保證線程公平的訪問隊列,即如果隊列滿了,那麼被阻塞在外面的線程對隊列訪問的順序是不能保證線程公平(即先阻塞,先插入)的。
2、LinkedBlockingQueue一個由鏈表結構組成的有界阻塞隊列
此隊列按照先出先進的原則對元素進行排序
3、PriorityBlockingQueue 支持優先級的無界阻塞隊列
4、DelayQueue 支持延時獲取元素的無界阻塞隊列,即可以指定多久才能從隊列中獲取當前元素
5、SynchronousQueue不存儲元素的阻塞隊列,每一個put必須等待一個take操作,否則不能繼續添加元素。並且他支持公平訪問隊列。
6、LinkedTransferQueue由鏈表結構組成的無界阻塞TransferQueue隊列。相對於其他阻塞隊列,多了tryTransfer和transfer方法
transfer方法
如果當前有消費者正在等待接收元素(take或者待時間限制的poll方法),transfer可以把生產者傳入的元素立刻傳給消費者。如果沒有消費者等待接收元素,則將元素放在隊列的tail節點,並等到該元素被消費者消費了才返回。
tryTransfer方法
用來試探生產者傳入的元素能否直接傳給消費者。,如果沒有消費者在等待,則返回false。和上述方法的區別是該方法無論消費者是否接收,方法立即返回。而transfer方法是必須等到消費者消費了才返回。
7、LinkedBlockingDeque鏈表結構的雙向阻塞隊列,優勢在於多線程入隊時,減少一半的競爭。
3.併發隊列
併發,在操作系統中,是指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。
在併發隊列上JDK提供了兩套實現,
一個是以ConcurrentLinkedQueue爲代表的高性能隊列非阻塞,
一個是以BlockingQueue接口爲代表的阻塞隊列,無論哪種都繼承自Queue。
先進先出(FIFO):先插入的隊列的元素也最先出隊列,類似於排隊的功能。從某種程度上來說這種隊列也體現了一種公平性。
後進先出(LIFO):後插入隊列的元素最先出隊列,這種隊列優先處理最近發生的事件。
4.雙端隊列
雙端隊列deque ,一種具有隊列和棧的性質的數據結構。雙端隊列中的元素可以從兩端彈出,相比list增加[]運算符重載。
雙端隊列允許在隊列兩端進行插入/刪除操作。
Deque是一個雙端隊列接口,繼承自Queue接口。
具體內容來自以下鏈接,本文僅是作爲初學者的簡單總結和記錄