Java知識點總結(Java容器-Queue)

Java知識點總結(Java容器-Queue)

@(Java知識點總結)[Java, Java容器]java

Queue

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 移除並返回隊列頭部的元素 若是隊列爲空,則阻塞
  • 拋出異常:是指當阻塞隊列滿時候,再往隊列裏插入元素,會拋出IllegalStateException(「Queue full」)異常。當隊列爲空時,從隊列裏獲取元素時會拋出NoSuchElementException異常 。
  • 返回特殊值:插入方法會返回是否成功,成功則返回true。移除方法,則是從隊列裏拿出一個元素,若是沒有則返回null
  • 一直阻塞:當阻塞隊列滿時,若是生產者線程往隊列裏put元素,隊列會一直阻塞生產者線程,直到拿到數據,或者響應* 中斷退出。當隊列空時,消費者線程試圖從隊列裏take元素,隊列也會阻塞消費者線程,直到隊列可用。
  • 超時退出:當阻塞隊列滿時,隊列會阻塞生產者線程一段時間,若是超過必定的時間,生產者線程就會退出。

阻塞隊列

ArrayBlockingQueue :一個由數組結構組成的有界阻塞隊列。
LinkedBlockingQueue :一個由鏈表結構組成的有界阻塞隊列。
PriorityBlockingQueue :一個支持優先級排序的無界阻塞隊列。
DelayQueue:一個使用優先級隊列實現的無界阻塞隊列。
SynchronousQueue:一個不存儲元素的阻塞隊列。
LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列。
LinkedBlockingDeque:一個由鏈表結構組成的雙向阻塞隊列。數據結構

非阻塞隊列

ConcurrentLinkedQueue :基於連接節點的無界線程安全隊列測試

Queue的使用

/**
 * 隊列測試:實現類使用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]
    }

}
相關文章
相關標籤/搜索