java Queue佇列相關總結
阿新 • • 發佈:2019-02-06
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 移除並返回佇列頭部的元素 如果佇列為空,則阻塞