@(Java知識點總結)[Java, Java容器]java
Queue接口與List、Set是在同一級別,都是繼承了Collection接口。LinkedList接口實現了Queue接口。Queue接口收縮了對LinkedList的方法訪問權限(也就是方法參數若是是Queue,那就只能方法Queue接口定義的方法),讓方法可以正確的使用。數組
隊列是一種數據結構,它有兩個基本操做:在隊列尾部添加一個元素,和在隊列頭部移除一個元素。也就是說,隊列以一種先進先出(FIFO)的方式操做數據。
隊列,它主要分爲兩大類,一類是阻塞式隊列,隊列滿了之後再插入元素則會拋出異常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另外一種隊列則是雙端隊列,支持在頭、尾兩端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。安全
方法 | 功能 | 異常處理 |
---|---|---|
add | 增長一個元索 | 若是隊列已滿,則拋出一個IIIegaISlabEepeplian異常 |
remove | 移除並返回隊列頭部的元素 | 若是隊列爲空,則拋出一個NoSuchElementException異常 |
element | 返回隊列頭部的元素 | 若是隊列爲空,則拋出一個NoSuchElementException異常 |
offer | 添加一個元素並返回true | 若是隊列已滿,則返回false |
poll | 移除並返問隊列頭部的元素 | 若是隊列爲空,則返回null |
peek | 返回隊列頭部的元素 | 若是隊列爲空,則返回null |
put | 添加一個元素 | 若是隊列滿,則阻塞 |
take | 移除並返回隊列頭部的元素 | 若是隊列爲空,則阻塞 |
ArrayBlockingQueue :一個由數組結構組成的有界阻塞隊列。
LinkedBlockingQueue :一個由鏈表結構組成的有界阻塞隊列。
PriorityBlockingQueue :一個支持優先級排序的無界阻塞隊列。
DelayQueue:一個使用優先級隊列實現的無界阻塞隊列。
SynchronousQueue:一個不存儲元素的阻塞隊列。
LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列。
LinkedBlockingDeque:一個由鏈表結構組成的雙向阻塞隊列。數據結構
ConcurrentLinkedQueue :基於連接節點的無界線程安全隊列測試
/** * 隊列測試:實現類使用LinkedList * * Queue也有不少其餘的實現類,好比java.util.concurrent.LinkedBlockingQueue。 * LinkedBlockingQueue是一個阻塞的線程安全的隊列,底層實現也是使用鏈式結構。 */ public class TestQuene { // 定義一個隊列 Queue<String> queue; @Before public void before() { // 實例化隊列變量 queue = new LinkedList<String>(); // add方法向隊列中添加元素,返回布爾值,add方法添加失敗時會拋異常,不推薦使用 // queue.add("1"); // queue.add("2"); // queue.add("3"); // queue.add("4"); // queue.add("5"); // offer方法向隊列中添加元素,返回布爾值 queue.offer("a"); queue.offer("b"); queue.offer("c"); queue.offer("d"); queue.offer("e"); } // poll方法移除隊列首個元素並返回,若隊列爲空,返回null @Test public void test1() { // 彈出元素 String pollEle = queue.poll(); // 先進先出,彈出了a System.out.println(pollEle); // a System.out.println(queue); // [b, c, d, e] } // remove方法移除首個元素並返回,若隊列爲空,會拋出異常:NoSuchElementException,不推薦使用 @Test public void test2() { // 彈出元素 String remove = queue.remove(); // 先進先出,彈出了a System.out.println(remove); // a System.out.println(queue); // [b, c, d, e] } // peek方法返回隊列首個元素,但不移除,若隊列爲空,返回null @Test public void test3() { // 查看首個元素 String peek = queue.peek(); // 首個元素是a,最早加入 System.out.println(peek); // a System.out.println(queue); // [a, b, c, d, e] } // element方法返回隊列的頭元素,但不移除,若隊列爲空,會拋出異常:NoSuchElementException,不推薦使用 @Test public void test4() { // 查看首個元素 String element = queue.element(); System.out.println(element); // a System.out.println(queue); // [a, b, c, d, e] } }