【Java源碼】集合類-隊列Queue

1、描述

隊列Queue這種數據結構,一般指先進先出(FIFO)這種容器。能夠模擬生活中依次排隊這種場景。安全

下面是集合體系繼承樹:

2、Queue

Queue和List同樣都是Collection的子接口。數據結構

Queue源碼定義:

public interface Queue<E> extends Collection<E> {
    boolean add(E e);
    boolean offer(E e);
    E remove();
    E poll();
    E element();
    E peek();
}
  • add(E e)/offer(E e) 將指定元素加入到隊列尾部
  • remove() 返回隊列頭部元素並刪除,若是隊列爲空,會拋NoSuchElementException
  • poll() 返回隊列頭部元素並刪除,若是隊列爲空,返回null
  • element() 返回隊列頭部元素不刪除,若是隊列爲空,會拋NoSuchElementException
  • peek() 返回隊列頭部元素不刪除,若是隊列爲空,返回null

Queue的實現有PriorityQueue、ArrayDeque、LinkedList。其中ArrayDeque、LinkedList是實現的其子接口Deque。性能

3、Deque

從上面的繼承圖能夠清楚的看到,Deque是Queue的子接口,它不只是隊列的數據結構,也是一個雙端隊列數據結構,同時也是一個棧(stack)的數據結構。線程

Deque源碼定義:

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

  • push(E e) 入棧
  • pop() 出棧,若是棧爲空時出棧會拋出NoSuchElementException異常,因此在出棧以前先peek()查看頭部元素,若是棧爲空會返回null.

Stack類

Java中還有一個Stack類,這個類繼承Vector。繼承

public class Stack<E> extends Vector<E> {

從源碼中能夠看到Stack的pop()和peek()方法都是被synchronized修飾的。所以Stack的棧是線程安全的,但也所以下降了棧的性能。因此當咱們不須要線程安全的場景時,應該用Deque.接口

public synchronized E peek()

public synchronized E pop()
相關文章
相關標籤/搜索