深入理解Java集合之---Deque

Deque

interface Deque <E>

子接口:

BlockingDeque <E>

实现类:

Deque

线性集合,支持两端的元素插入和移除。Deque是double ended queue的简称,习惯上称之为双端队列。大多数Deque 实现对它们可能包含的元素的数量没有固定的限制,但是该接口支持容量限制的deques以及没有固定大小限制的deque。

在大多数实现中,插入操作不会失败。

发音为deck,千万因为发音问题出丑哦。

Deque同时扩展了Queue接口,当Deque作为队列的时候,会产生FIFO(先进先出)行为。元素添加在双端队列的末尾并从头开始删除。

Queue 方法 等效Deque方法
add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()

同时,Deque也可以作为LIFO(后进先出)堆栈,此接口优于传统的Stack类使用。

Stack和Deque方法的比较

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

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

这个接口提供了两种方法去除内部元素,removeFirstOccurrence和removeLastOccurrence。

removeFirstOccurrence(Object o) removeLastOccurrence(Object o)
从此双端队列中移除指定元素的第一个匹配项。 从此双端队列中移除指定元素的最后一次出现。

虽然 Deque 实现没有严格要求禁止插入 null 元素,但建议最好这样做。建议任何事实上允许 null 元素的 Deque 实现用户最好不 要利用插入 null 的功能。这是因为各种方法会将null 用作特殊的返回值来指示双端队列为空。

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

Deque的使用场景
在一般情况,不涉及到并发的情况下,有两个实现类,可根据其自身的特性进行选择,分别是:

  • LinkedList 大小可变的链表双端队列,允许元素为插入null。
  • ArrayDeque 大下可变的数组双端队列,不允许插入null。
  • ConcurrentLinkedDeque 大小可变且线程安全的链表双端队列,非阻塞,不允许插入null。
  • LinkedBlockingDeque 为线程安全的双端队列,在队列为空的情况下,获取操作将会阻塞,直到有元素添加。

注意:LinkedList 和 ArrayDeque 是线程不安全的容器。

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,098评论 0 13
  • Java集合框架 Java中封装了许多常用的数据结构,称为集合框架,可以有效组织数据,提高程序性能。最初Java只...
    Steven1997阅读 410评论 0 2
  • 栈 栈的英文单词是Stack,它代表一种特殊的线性表,这种线性表只能在固定一端(通常认为是线性表的尾端)进行插入,...
    Jack921阅读 803评论 0 5
  • 一:基本概念 Java的所有集合都放在java.util包下,集合跟数组不同之处在于前者只能保存对象(对象的引...
    Febers阅读 93评论 0 0
  • 清晨,独自行走,耳畔响起: “春有百花秋有月,夏有凉风冬有雪,若无闲事挂心头,便是人间好时节。好来好往好聚首,春去...
    嶒經哋嶒經阅读 221评论 0 0