JDK8源码阅读笔记
切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

Deque



支持在两端插入和删除元素的线性集合。名称deque是“double ended queue”的缩写,通常发音为“ deck”。大多数Deque实现对它们可能包含的元素数量没有固定的限制,但是此接口支持容量受限的双端队列以及没有固定大小限制的双端队列。

该接口定义了访问双端队列两端元素的方法。提供了用于插入,删除和检查元素的方法。这些方法均以两种形式存在:一种在操作失败时引发异常,另一种返回特殊值(nullfalse,具体取决于操作)。后一种形式的插入操作是专为容量受限的Deque实现而设计的;在大多数实现中,插入操作不会失败。

下表总结了上述十二种方法:

抛出异常(头元素) 返回特殊值(头元素) 抛出异常(末尾元素) 返回特殊值(末尾元素)
插入 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()

双端队列也可以用作LIFO(后进先出)堆栈。此接口应优先于旧式Stack类使用。当双端队列用作堆栈时,元素从双端队列的开头被压入以及弹出。堆栈方法完全等同于Deque方法,如下表所示:

Stack方法 等效的Deque方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()

注意,当双端队列用作队列或堆栈时,peek方法同样有效。无论哪种情况,元素都是从双端队列的开头开始绘制的。

该接口提供了两种删除内部元素的方法:removeFirstOccurrenceremoveLastOccurrence

List接口不同,此接口不支持对元素的索引访问。

虽然并非严格要求Deque实现禁止插入空元素,但强烈建议这样做。强烈建议所有使用允许null元素的Deque实现的用户不要插入null。之所以如此,是因为各种方法都将null用作特殊的返回值,以指示双端队列为空。

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

该接口也是Java集合框架的成员。


1. void addFirst(E e)

如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此双端队列的前面,如果当前没有可用空间,则抛出IllegalStateException。使用有容量限制的双端队列时,通常最好使用方法offerFirst


2. void addLast(E e)

如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此双端队列的后面,如果当前没有可用空间,则抛出IllegalStateException。使用有容量限制的双端队列时,通常最好使用方法offerLast

此方法等效于add


3. boolean offerFirst(E e)

将指定的元素插入此双端队列的前面,除非该操作违反容量限制。使用容量受限的双端队列时,此方法通常比addFirst方法更可取,后者只能通过引发异常才能不插入元素。


4. boolean offerLast(E e)

将指定的元素插入此双端队列的后面,除非该操作违反容量限制。使用容量受限的双端队列时,此方法通常比addLast方法更可取,后者只能通过引发异常才能不插入元素。


5. E removeFirst()

检索并删除此双端队列的第一个元素。此方法与pollFirst的不同之处仅在于,如果此双端队列为空,则它将引发异常。


6. E removeLast()

检索并删除此双端队列的最后一个元素。此方法与pollLast的不同之处仅在于,如果此双端队列为空,则它将引发异常。


7. E pollFirst()

检索并删除此双端队列的第一个元素,如果此双端队列为空,则返回null


8. E pollLast()

检索并删除此双端队列的最后一个元素,如果此双端队列为空,则返回null


9. E getFirst()

检索但不删除此双端队列的第一个元素。

该方法与peekFirst的不同之处仅在于当双端队列为空时本方法将抛出异常。


10. E getLast()

检索但不删除此双端队列的最后一个元素。

该方法与peekLast的不同之处仅在于当双端队列为空时本方法将抛出异常。


11. E peekFirst()

检索但不删除此双端队列的第一个元素,或者如果当前双端队列为空的话,则返回null


12. E peekLast()

检索但不删除此双端队列的最后一个元素,或者如果当前双端队列为空的话,则返回null


13. boolean removeFirstOccurrence(Object o)

从此双端队列中删除指定元素的第一次出现。如果双端队列不包含元素,则它保持不变。更准确地讲,删除第一个满足(o==null ? e==null : o.equals(e))的元素e(如果存在这样的元素)。

如果此双端队列包含指定的元素(或者等效地,如果此双端队列由于调用该方法而更改),则返回true


14. boolean removeLastOccurrence(Object o)

从此双端队列中删除指定元素的最后一次出现。如果双端队列不包含元素,则它保持不变。更准确地讲,删除最后一个满足(o==null ? e==null : o.equals(e))的元素e(如果存在这样的元素)。

如果此双端队列包含指定的元素(或者等效地,如果此双端队列由于调用该方法而更改),则返回true


15. boolean add(E e)

如果可能的话立即将指定的元素插入此双端队列所表示的队列中(换句话说,插入到此双端队列的末尾),而不会违反容量限制,则在成功后返回true,如果当前没有可用空间,则抛出一个IllegalStateException。使用容量受限的双端队列时,通常最好使用offer

该方法等效于addLast


16. boolean offer(E e)

如果可能的话立即将指定的元素插入此双端队列所表示的队列中(换句话说,插入到此双端队列的末尾),而不会违反容量限制,则在成功后返回true,如果当前没有可用空间,则返回false。使用容量受限的双端队列时,该方法通常好于使用add,因为add方法在触发容量上限后是抛出异常。

该方法等效于offerLast


17. E remove()

检索并删除此双端队列所表示队列的头部(换句话说,此双端队列的第一个元素)。此方法与poll的不同之处仅在于,如果此双端队列为空,则它将引发异常。

该方法等效于removeFirst()


18. E poll()

检索并删除此双端队列所表示队列的头部(换句话说,此双端队列的第一个元素),如果此双端队列为空,则返回null

该方法等效于pollFirst()


19. E element()

检索但不删除此双端队列所表示队列的头部(换句话说,此双端队列的第一个元素)。此方法与peek的不同之处仅在于,如果此双端队列为空,则它将引发异常。

该方法等效于getFirst()


20. E peek()

检索但不删除此双端队列所表示队列的头部(换句话说,此双端队列的第一个元素),如果此双端队列为空,则返回null

该方法等效于peekFirst()


21. void push(E e)

如果不违反容量限制则立即将元素压入此双端队列表示的堆栈(换句话说,此双端队列的开头),如果当前没有可用空间,则抛出IllegalStateException

该方法等效于addFirst


22. E pop()

从此双端队列所表示的堆栈中弹出一个元素。换句话说,删除并返回此双端队列的第一个元素。

该方法等效于removeFirst()


23. boolean remove(Object o)

从此双端队列删除指定元素的第一次出现。如果双端队列不包含此元素,则它保持不变。更正式地讲,删除第一个可以使得(o==null ? e==null : o.equals(e))的元素e(如果存在这样的元素)。如果此双端队列包含指定的元素(或者等效地,如果此双端队列由于调用而更改),则返回true

该方法等效于removeFirstOccurrence(Object)


24. boolean contains(Object o)

如果此双端队列包含指定的元素,则返回true。更正式地讲,当且仅当此双端队列至少包含一个元素e可以满足(o==null ? e==null : o.equals(e))时返回true


25. public int size()

返回此双端队列中的元素数。


26. Iterator<E> iterator()

以适当的顺序返回此双端队列中的元素的迭代器。元素将按照从前(头)到后(尾)的顺序返回。


27. Iterator<E> descendingIterator()

以相反的顺序返回此双端队列中的元素的迭代器。元素将按从最后(尾)到第一个(头)的顺序返回。