【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()
相关文章
相关标签/搜索