Java队列学习

Posted superthanos

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java队列学习相关的知识,希望对你有一定的参考价值。

队列是Java集合中的重要组成部分,具有先进先出的特性,使其具有广泛的应用场景,比如排队等。因此今天就来学习一下Java中的队列。本文的例子使用的Java8环境。

继承类图

学习队列,首先要知道它的类继承体系,知道每种队列都实现了哪些接口,继承了哪些类,这样有助于帮助我们理解。下面是Java8中队列的类继承图。 

 技术分享图片

从继承类图中可以看出,队列主要分两种,一种是非阻塞队列,实现了Queue接口,包括LinkedList,ArrayDeque和PriorityQueue;一种是阻塞队列,实现了BlockingQueue,包括ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue和LinkedBlockingDeque.

Iterable接口

实现了Iterable接口的类就具有了迭代的功能,可以被用于“for-Each”循环语句。该接口具有的方法如下:

public interface Iterable<T> {
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

Queue接口

Queue接口代表着队列,在队头删除元素,队尾插入元素,有着先进先出的特性,下面是接口声明的方法

 1 public interface Queue<E> extends Collection<E> {
 2     
 3     //插入元素到队尾,成功返回true,失败返回false,空间不足抛出异常
 4     boolean add(E e);
 5 
 6     //插入元素到队尾,成功返回true,失败返回false
 7     boolean offer(E e);
 8 
 9     //移除并返回队头元素,如果队列为空,抛出异常
10     E remove();
11 
12     //移除并返回队头元素,如果队列为空,则返回null
13     E poll();
14 
15    //返回队头元素,如果队列为空,则抛出异常
16     E element();
17 
18     //返回队头元素,如果队列为空,则返回null
19     E peek();
20 }

 

Deque接口

 Deque是双端队列,是Double End Queue的简称,与Queue只能在队头删除元素,队尾插入元素不同,Deque可以在队列的头尾分别进行插入和删除元素。由于可以在同一端进行插入和

删除元素,因此可以被当做栈来使用。下面是该接口声明的方法:

public interface Deque<E> extends Queue<E> {
    /**
     * 在队头插入元素,如果队列对容量有限制,则容量不足时抛出异常
     * IllegalStatException
     */
    void addFirst(E e);

    /**
     * 在队尾插入元素,如果队列对容量有限制,则容量不足时抛出异常
     * IllegalStatException
     */
    void addLast(E e);

    /**
     * 在队头插入元素,插入成功返回true,失败返回false
     * 如果队列对容量有限制,则最好使用该方法
     */
    boolean offerFirst(E e);

    /**
     * 在队尾插入元素,成功返回true,失败返回false;
     * 如果队列对容量有限制,则最好使用该方法
     */
    boolean offerLast(E e);

    /**
     * 返回并移除队头的元素,如果队列为空,则抛出异常
     */
    E removeFirst();

    /**
     * 返回并移除队尾的元素,如果队列为空,则抛出异常
     */
    E removeLast();

    /**
     * 返回并移除队头的元素,如果队列为空,则返回null
     */
    E pollFirst();

    /**
     * 返回并移除队尾的元素,如果队列为空,则返回null
     */
    E pollLast();

    /**
     * 返回队头的元素,如果队列为空,则抛出异常NoSuchElementException
     */
    E getFirst();

    /**
     * 返回队尾的元素,如果队列为空,则抛出异常NoSuchElementException
     */
    E getLast();

    /**
     * 返回队头的元素,如果队列为空,则返回null
     */
    E peekFirst();

    /**
     * 返回队尾的元素,如果队列为空,则返回null
     */
    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();

}

BlockingQueue接口

BlockingQueue是java.util.concurrent包提供的接口,表示阻塞队列,与普通队列的区别是:当从队头获取元素时,如果队列为空,则阻塞队列会阻塞,直到有可用元素、等待超时或者被中断;

当需要在队尾插入元素时,如果队列没有可用的空间,则操作会阻塞,直到有可用空间、等待超时或者被中断。下面是该接口声明的方法:

public interface BlockingQueue<E> extends Queue<E> {
    
    boolean add(E e);

    boolean offer(E e);

    /**
     * 插入元素,如果空间不足,将会阻塞,直到有可用空间
     */
    void put(E e) throws InterruptedException;

    /**
     * 插入元素,如果容量不足,将会阻塞,直到有可用空间,或者等待超时
     */
    boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 返回并移除队头的元素,如果队列为空,则等待
     * 
     */
    E take() throws InterruptedException;

    /**
     * 返回并移除队头的元素,如果队列为空,则阻塞,直到有可用元素,或者等待超时
     * 
     */
    E poll(long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 返回队列还能存放多少个元素
     * 该方法不会被阻塞,直接返回
     */
    int remainingCapacity();

    /**
     * 删除给定的元素,如果给定的元素在队列存在多个,则只删除第一个
     * 成功删除,返回true,否则,返回false
     */
    boolean remove(Object o);

    /**
     * 队列中是否存在给定的元素,存在返回true,否则返回false
     */
    public boolean contains(Object o);

    /**
     * 从队列中删除所有元素,并添加到给定的容器c中
     * 该方法比循环调用poll方法更高效
     */
    int drainTo(Collection<? super E> c);

    /**
     * 最多从队列中删除maxElements个元素,并添加到容器c中
     */
    int drainTo(Collection<? super E> c, int maxElements);
}

BlockingDeque接口

BlockingDeque是双端阻塞队列,可以在队列的头和尾分别进行元素的插入和删除,可以用作阻塞栈,下面是该接口声明的方法:

public interface BlockingDeque<E> extends BlockingQueue<E>, Deque<E> {
    void addFirst(E e);

    void addLast(E e);

    boolean offerFirst(E e);

    boolean offerLast(E e);

    void putFirst(E e) throws InterruptedException;

    void putLast(E e) throws InterruptedException;

    boolean offerFirst(E e, long timeout, TimeUnit unit) throws InterruptedException;

    boolean offerLast(E e, long timeout, TimeUnit unit) throws InterruptedException;

    E takeFirst() throws InterruptedException;

    E takeLast() throws InterruptedException;

    E pollFirst(long timeout, TimeUnit unit) throws InterruptedException;

    E pollLast(long timeout, TimeUnit unit) throws InterruptedException;

    boolean removeFirstOccurrence(Object o);

    boolean removeLastOccurrence(Object o);

    // *** BlockingQueue methods ***
    boolean add(E e);

    boolean offer(E e);

    void put(E e) throws InterruptedException;

    boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;

    E remove();

    E poll();

    E take() throws InterruptedException;

    E poll(long timeout, TimeUnit unit) throws InterruptedException;

    E element();

    E peek();

    boolean remove(Object o);

    public boolean contains(Object o);

    public int size();

    Iterator<E> iterator();

    // *** Stack methods ***
    void push(E e);
}

 

以上是关于Java队列学习的主要内容,如果未能解决你的问题,请参考以下文章

java SpringRetry学习的代码片段

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

队列(Java实现)

Java队列学习

RabbitMQ学习笔记五:RabbitMQ之优先级消息队列

Java数据结构——队列