【攻克java集合系列(二)】java集合中的Queue队列全面分析

x33g5p2x  于2021-12-06 转载在 Java  
字(2.7k)|赞(0)|评价(0)|浏览(331)

之前我们对List集合系列进行了比较详细的分析,今天我们来研究一下java集合中的另一个分支系列——Queue。

Queue队列系列集合的继承实现关系。

队列的介绍

队列是一种特殊的线性结构。它只允许在表头进行删除操作,而在表尾进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO)线性表。

Queue源码分析

public interface Queue<E> 
	   extends Collection<E>

Queue接口位于java.util包中,Queue接口与List、Set同一级别,都是继承至Collection接口。所以Queue也是java集合体系中的一部分。

Queue源码中提供了一些入队出队的方法,如下:

package java.util;

public interface Queue<E> extends Collection<E> {
    //将指定的元素插入到此队列中,插入成功返回true,插入失败(容量不足)返回false
    boolean add(E e);

    //将指定的元素插入到此队列中,插入成功返回true,插入失败(容量不足)返回false
    boolean offer(E e);

    //检索并删除此队列的头
    E remove();

    //检索并删除此队列的头,如果为空,返回null
    E poll();

    //检索但不删除此队列的头
    E element();

    //检索但不删除此队列的头,如果队列为空返回null
    E peek();
}

Deque

Deque是Double ended queue的缩写,即双端队列,它是支持两端元素插入和移除的线性集合。

Deque继承至Queue,也被LinkedList所实现,所以它也可以当做先进先出的队列使用。

public interface Deque<E>
        extends Queue<E>

在Deque中不仅继承了Queue和Collection中的方法,也还新加入了部分新方法。

//在此双端队列的队头插入指定元素
	void addFirst(E e);

    //在此双端队列的队尾插入指定元素
    void addLast(E e);

    //在此双端队列的队头插入指定元素
    boolean offerFirst(E e);

    //在此双端队列的队尾插入指定元素
    boolean offerLast(E e);

    //检索并删除此deque的第一个元素。
    E removeFirst();

    //检索并删除此deque的最后一个元素。 
    E removeLast();

    //检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。
    E pollFirst();

    //检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。 
    E pollLast();

    //检索,但不删除,这个deque的第一个元素。 
    E getFirst();

    //检索,但不删除,这个deque的最后一个元素。 
    E getLast();

    //检索,但不删除,此deque的第一个元素,如果这个deque是空的返回 null。 
    E peekFirst();

    //检索,但不删除,此deque的最后一个元素,如果这个deque是空的返回 null。 
    E peekLast();

    //从此deque中删除指定元素的第一个出现。 
    boolean removeFirstOccurrence(Object o);

    //从此deque中删除指定元素的最后一个出现。 
    boolean removeLastOccurrence(Object o);

	//将元素推送到由此deque表示的堆栈
    void push(E e);

    //从这个deque表示的堆栈中弹出一个元素。 
    E pop();

AbstractQueue

AbstractQueue是Queue的一个实现类,它继承至AbstractCollection,也实现了Queue接口。

public abstract class AbstractQueue<E>
    extends AbstractCollection<E>
    implements Queue<E>

AbstractQueue类提供了一些Queue操作的骨架实现。

  • 将指定的元素插入到此队列中。
public boolean add(E e) {
        if (offer(e))
            return true;
        else
            throw new IllegalStateException("Queue full");
    }
  • 将指定集合中的所有元素添加到此队列中。
public boolean addAll(Collection<? extends E> c) {
        if (c == null)
            throw new NullPointerException();
        if (c == this)
            throw new IllegalArgumentException();
        boolean modified = false;
        for (E e : c)
            if (add(e))
                modified = true;
        return modified;
    }
  • 从此队列中删除所有元素。
public void clear() {
        while (poll() != null)
            ;
    }
  • 检索,但不删除,这个队列的头。
public E element() {
        E x = peek();
        if (x != null)
            return x;
        else
            throw new NoSuchElementException();
    }
  • 检索并删除此队列的头。
public E remove() {
        E x = poll();
        if (x != null)
            return x;
        else
            throw new NoSuchElementException();
    }

ArrayDeque

ArrayDeque是Deque的一个实现类,他继承至AbstractCollection,并且实现了Deque, Cloneable, Serializable接口,它是可复制、可序列化的。

public class ArrayDeque<E> extends AbstractCollection<E>
                           implements Deque<E>, Cloneable, Serializable

ArrayDeque底层使用数组实现,数组的容量可以动态的扩充。

它不是线程安全的; 在没有外部同步的情况下,它们不支持多线程的并发访问。

ArrayDeque可以当做栈或者队列使用,且效率比Stack和LinkedList更高。

相关文章

微信公众号

最新文章

更多