隊列Queue這種數據結構,一般指先進先出(FIFO)這種容器。能夠模擬生活中依次排隊這種場景。安全
Queue和List同樣都是Collection的子接口。數據結構
public interface Queue<E> extends Collection<E> { boolean add(E e); boolean offer(E e); E remove(); E poll(); E element(); E peek(); }
Queue的實現有PriorityQueue、ArrayDeque、LinkedList。其中ArrayDeque、LinkedList是實現的其子接口Deque。性能
從上面的繼承圖能夠清楚的看到,Deque是Queue的子接口,它不只是隊列的數據結構,也是一個雙端隊列數據結構,同時也是一個棧(stack)的數據結構。線程
public interface Deque<E> extends Queue<E> { void addFirst(E e); void addLast(E e); boolean offerFirst(E e); boolean offerLast(E e); E removeFirst(); E removeLast(); E pollFirst(); E pollLast(); E getFirst(); E getLast(); E peekFirst(); E peekLast(); boolean removeFirstOccurrence(Object o); boolean removeLastOccurrence(Object o); // *** Queue methods *** boolean add(E e); boolean offer(E e); E remove(); E poll(); E element(); E peek(); // *** Stack methods *** void push(E e); E pop(); // *** Collection methods *** boolean remove(Object o); boolean contains(Object o); public int size(); Iterator<E> iterator(); Iterator<E> descendingIterator(); }
Deque的接口和上面的Queue的操做基本相同。xxxFirst操做隊列頭部元素,xxxLast操做隊列尾部元素。code
另外Deque能夠表示一個棧(stack):具備後進先出(LIFO)的特徵。blog
Java中還有一個Stack類,這個類繼承Vector。繼承
public class Stack<E> extends Vector<E> {
從源碼中能夠看到Stack的pop()和peek()方法都是被synchronized修飾的。所以Stack的棧是線程安全的,但也所以下降了棧的性能。因此當咱們不須要線程安全的場景時,應該用Deque.接口
public synchronized E peek() public synchronized E pop()