数据结构 - QueueDeque 接口

Posted yuanjiangnan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 - QueueDeque 接口相关的知识,希望对你有一定的参考价值。

技术图片

简介

队列是一种特殊的线性表。队列有单向队列和双向队列,队列内部结构多大使用数组和链表存储,一般使用数组存储的都会有初试长度和最大长度等,一般使用链表存储没有长度限制。平时在使用中最好不要像队列中插入null(通常也不允许,LinkedList除外),因为null值通常用于poll方法表示当前队列没有元素了,插入null值poll就有歧义。

Queue 接口
public interface Queue<E> extends Collection<E>

Queue继承Collection,它是单向队列,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

Queue 方法
// 添加元素到尾部,队列满时抛IllegalStateException异常
boolean add(E e);
// 添加元素到尾部,队列满时返回false
boolean offer(E e);
// 移除头部元素,队列空时抛NoSuchElementException异常
E remove();
// 移除并返回头部元素,队列为空时返回null   
E poll();
// 查询头部元素,队列为空时抛NoSuchElementException异常
E element();
// 查询头部元素,队列为空时返回null 
E peek();
Deque 接口
public interface Deque<E> extends Queue<E>

Deque继承自Queue,它是双向队列,Queue只允许取头插尾,而Deque两端都允许插取

Deque 方法
// 添加元素到尾部,队列满时抛IllegalStateException异常
void addFirst(E e);
// 添加元素到头部,队列满时抛IllegalStateException异常
void addLast(E e);
// 添加元素到尾部,队列满时返回false
boolean offerFirst(E e);
// 添加元素到头部,队列满时返回false   
boolean offerLast(E e);
// 移除头部元素,队列空时抛NoSuchElementException异常 
E removeFirst();
// 移除尾部元素,队列空时抛NoSuchElementException异常
E removeLast();
// 移除并返回头部元素,队列为空时返回null   
E pollFirst();
// 移除并返回尾部元素,队列为空时返回null   
E pollLast();
// 查询头部元素,队列为空时抛NoSuchElementException异常
E getFirst();
// 查询尾部元素,队列为空时抛NoSuchElementException异常
E getLast();
// 查询头部元素,队列为空时返回null  
E peekFirst();
// 查询尾部元素,队列为空时返回null   
E peekLast();
// 从头部开始移除第一个o元素,不存在返回false
boolean removeFirstOccurrence(Object o);
// 从尾部开始移除第一个o元素,不存在返回false
boolean removeLastOccurrence(Object o);
AbstractQueue 抽象类
public abstract class AbstractQueue<E> extends AbstractCollection<E>  
	implements Queue<E>

AbstractQueue 继承AbstractCollection抽象类

AbstractQueue 构造函数
protected AbstractQueue() {
}
AbstractQueue 已实现的方法
public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}

add 实际上调用offer(e),offer(e)返回false时抛异常

public E remove() {
    E x = poll();
    if (x != null)
        return x;
    else
        throw new NoSuchElementException();
}

remove() 实际上调用poll(),poll()返回null时抛异常

public E element() {
    E x = peek();
    if (x != null)
        return x;
    else
        throw new NoSuchElementException();
}

element() 实际上调用peek(),peek()返回null时抛异常

public void clear() {
    while (poll() != null)
        ;
}

清空所有元素

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;
}

线性集合转化为队列,队列满了一样会抛异常

AbstractQueue抽象类没有实现Queue接口的于offer()、poll()和peek()方法
技术图片


以上是关于数据结构 - QueueDeque 接口的主要内容,如果未能解决你的问题,请参考以下文章

源码阅读(38):Java中线程安全的QueueDeque结构——LinkedTransferQueue

源码阅读:Java中主要的QueueDeque结构——概述

源码阅读(39):Java中线程安全的QueueDeque结构——LinkedTransferQueue

源码阅读(39):Java中线程安全的QueueDeque结构——LinkedTransferQueue

源码阅读(36):Java中线程安全的QueueDeque结构——LinkedBlockingQueue

源码阅读(36):Java中线程安全的QueueDeque结构——LinkedBlockingQueue