【Java】Deque 与 ArrayDeque

Java虽然提供了java.util.Stack来实现栈结构,但官方目前已不推荐使用,而是使用java.util.Deque双端队列来实现队列与栈的各种需求。java.util.Deque的实现子类有ArrayDeque, LinkedBlockingDeque, LinkedList 。其中java.util.LinkedList是基于链表的,java.util.ArrayDeque基于数据实现的双端队列。

Deque 接口

一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。它既可以当作栈使用,也可以当作队列使用。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

下表总结了12 种方法:

第一个元素(头部)最后一个元素(尾部)
抛出异常特殊值抛出异常特殊值
插入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 方法,如下表所示:

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

注意,在将双端队列用作队列或堆栈时,peek 方法同样正常工作;无论哪种情况下,都从双端队列的开头抽取元素。

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

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

ArrayDeque

Deque 接口的大小可变数组的实现。数组双端队列没有容量限制;它们可根据需要增加以支持使用。它们不是线程安全的;在没有外部同步时,它们不支持多个线程的并发访问。禁止 null 元素。此类很可能在用作堆栈时快于 Stack,在用作队列时快于 LinkedList

大多数 ArrayDeque 操作以摊销的固定时间运行。异常包括 removeremoveFirstOccurrenceremoveLastOccurrencecontainsiterator.remove() 以及批量操作,它们均以线性时间运行。

此类及其迭代器实现 CollectionIterator 接口的所有可选 方法。

此类是 Java Collections Framework 的成员。

与栈相关的方法:

pop()从此双端队列所表示的堆栈中弹出一个元素。即从队头弹出一个元素。
push(E e)将元素推入此双端队列所表示的堆栈。
peek()获取,但不移除此双端队列所表示的队列的头;如果此双端队列为空,则返回 null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值