前言

Deque 双端队列 继承了 Queue

java Deque peek的作用是什么_堆栈

Deque

文档介绍

一个线性collection,支持在两端插入和删除。deque 是 “double ended queue”的缩写。绝大多数的Deque实现对它们能包含的元素数没有固定的限制,但此接口支持容量限制,也支持没有固定大小限制的双端队列。

此接口定义了访问队列两端元素的方法。提供了插入,移除,检查元素的方法。这些的每个方法存在两种形式:如果失败一种抛出一个异常,一种返回一个特殊值(null 或 false, 依赖于具体的操作)。后一种形式的插入操作用于具有容量限制的特殊双端队列;在大多数实现中,插入操作不会失败。

上面介绍的十二个方法的概括
有意义的方法名 offer(提供) poll(剪短) peek(偷窃)

-

头部

头部

尾部

尾部

-

抛出异常

特殊值

抛出异常

特殊值

插入

addFirst(e)

offerFirst(e)

addLast(e)

offerLast(e)

移除

removeFirst()

pollFirst()

removeLast()

pollLast()

检查

getFirst()

peekFirst()

getLast()

peekLast()

此接口扩展了Queue接口。在将双端队列用于队列时,将得到FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从Queue接口继承的方法完全等效于Deque方法,展示在下表

Queue方法

等效Deque方法

add(e)

addLast(e)

offer(e)

offerLast(e)

remove()

removeFirst()

poll()

pollFirst()

element()

getFirst()

peek()

peekFirst()

双端队列也可用于后进先出堆栈。就优先使用此接口而不是遗留Stack类,当一个双端队列被用作堆栈时。Stack与Deque完全等价的方法在下面的表格展示

Stack 方法

等价的Deque方法

push(e)

addFirst(e)

pop()

removeFirst()

peek()

peekFirst()

注意,在将双端队列用作队列或堆栈时,peek方法同样正常工作;无论哪种情况下,都从双端队列的开头抽取元素
此接口提供了两种移除内部元素的方法:removeFirstOccurrence 和 removeLastOccurrence

与List接口不同,此接口不支持通过索引访问元素。

虽然Deque实现没有严格要求禁止插入null元素,但强烈建议最好这样做。建议使用任何允许null元素的实现的双端队列的用户不利用插入null的功能。这因为当双端队列为空时好多方法将null作为特殊的返回值

Deque 实现通常不定义基于元素的 equals 和 hashCode 方法,而是从 Object 类继承基于身份的 equals 和 hashCode 方法。

源码

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

    //队列的方法
    boolean add(E e);
    boolean offer(E e);
    E remove();
    E poll();
    E element();
    E peek();

    //堆栈的方法
    void push(E e);
    E pop();

    //集合的方法
    boolean remove(Object o);
    boolean contains(Object o);
    public int size();

    Iterator<E> iterator();
    Iterator<E> descendingIterator();
}