java Queue佇列相關總結

dreamcasher發表於2018-08-09

Queue:

按照新增的順序排列,FIFO(先進先出)。
通常佇列使用兩個方法:offer、poll。因為如果存放或者獲取失敗,返回false或者null(這種情況下不要往容器中新增null),而不是拋異常(異常很討厭額^_^)


執行緒不安全的佇列

  • LinkedList
            --implemets Deque
        由於實現了雙端佇列的介面,所以“LinkedList is a Queue”。可以將其當做一個佇列來使用(同樣可以使用offer、poll方法)。但是它是執行緒不安全的。

  • PriorityQueue
    特點是有序的,每新增一個元素會按照排序規則重新排序。如何定義排序規則呢?第一種,使用預設的排序規則,即元素實現Comparable介面中的compareTo方法;第二種,使用容器自身的排序規則,初始化時傳入一個Comparator,
    實現該介面的compare方法。compare的優先順序高於compareTo。

執行緒安全的佇列

  • ConcurrentLinkedQueue
    位於jdk1.5出的concurrent包下,所以這個類是執行緒安全的,依賴CAS機制實現(compareAndSwap:取出當前值,然後與預期值比較,如果一致,用更新值替換當前值,這一連串操作是原子操作,來源於CPU指令集)。
    屬於非阻塞佇列,相對於阻塞的佇列來說,效率要高一些。
  • LinkedBlockingQueue

        位於jdk1.5出的concurrent包下,所以這個類是執行緒安全的,依賴Reentrant鎖來實現。
        屬於阻塞佇列(使用put、take方法,如果佇列已滿或者已空,則一直阻塞下去)。
        屬於無界佇列(理論上來說是最大值為Integer.MAX_VALUE)


concurrent包下的5個阻塞對列

  •  ArrayBlockingQueue :一個由陣列支援的有界佇列。  
  •  LinkedBlockingQueue :一個由連結節點支援的可選有界佇列。
  •  PriorityBlockingQueue :一個由優先順序堆支援的無界優先順序佇列。
  •  DelayQueue :一個由優先順序堆支援的、基於時間的排程佇列。
  • SynchronousQueue :一個利用 BlockingQueue 介面的簡單聚集(rendezvous)機制。

區分佇列的相關集合的特點貌似有點兒困難,但是隻要記住這幾條黃金法則即可

  • 看到array就要想到有界
  • 看到linked就要想到first、last、無界
  • 看到bloking就要想到阻塞(阻塞的兩個方法put、take)
  • 看到priorit就要想到兩個介面:Comparable和Comparator

佇列中幾種操作

  • add 增加一個元索 如果佇列已滿,則丟擲一個IIIegaISlabEepeplian異常
  • remove 移除並返回佇列頭部的元素 如果佇列為空,則丟擲一個NoSuchElementException異常
  • element 返回佇列頭部的元素 如果佇列為空,則丟擲一個NoSuchElementException異常
  • offer 新增一個元素並返回true 如果佇列已滿,則返回false
  • poll 移除並返問佇列頭部的元素 如果佇列為空,則返回null
  • peek 返回佇列頭部的元素 如果佇列為空,則返回null
  • put 新增一個元素 如果佇列滿,則阻塞
  • take 移除並返回佇列頭部的元素 如果佇列為空,則阻塞
     

 

 

 

相關文章