java关于Deque的使用

定义
双向队列:支持插入删除元素的线性集合。
java官方文档推荐用deque实现栈(stack)。

和Queue的区别
Deque是double ended queue,将其理解成双端结束的队列,双端队列,可以在首尾插入或删除元素。
Queue的解释中,Queue就是简单的FIFO队列。
所以在概念上来说,Queue是FIFO的单端队列,Deque是双端队列。

在这里插入图片描述

特点
1.插入、删除、获取操作支持两种形式:快速失败和返回null或true/false
2.既具有FIFO特点又具有LIFO特点,即是队列又是栈
3.不推荐插入null元素,null作为特定返回值表示队列为空
4.未定义基于元素相等的equals和hashCode

接口分析

  • addFirst(): 向队头插入元素,如果元素为空,则发生NPE(空指针异常)
  • addLast(): 向队尾插入元素,如果为空,则发生NPE
  • offerFirst(): 向队头插入元素,如果插入成功返回true,否则返回false
  • offerLast(): 向队尾插入元素,如果插入成功返回true,否则返回false
  • removeFirst(): 返回并移除队头元素,如果该元素是null,则发生NoSuchElementException
  • removeLast(): 返回并移除队尾元素,如果该元素是null,则发生NoSuchElementException
  • pollFirst(): 返回并移除队头元素,如果队列无元素,则返回null
  • pollLast(): 返回并移除队尾元素,如果队列无元素,则返回null
  • getFirst(): 获取队头元素但不移除,如果队列无元素,则发生NoSuchElementException
  • getLast(): 获取队尾元素但不移除,如果队列无元素,则发生NoSuchElementException
  • peekFirst(): 获取队头元素但不移除,如果队列无元素,则返回null
  • peekLast(): 获取队尾元素但不移除,如果队列无元素,则返回null
  • pop(): 弹出栈中元素,也就是返回并移除队头元素,等价于removeFirst(),如果队列无元素,则发生NoSuchElementException
  • push(): 向栈中压入元素,也就是向队头增加元素,等价于addFirst(),如果元素为null,则发生NPE,如果栈空间受到限制,则发生IllegalStateException

实现
ArrayDeque: 基于数组实现的线性双向队列,通常作为栈或队列使用,但是栈的效率不如LinkedList高。
LinkedList: 基于链表实现的链式双向队列,通常作为栈或队列使用,但是队列的效率不如ArrayQueue高。

代码

private static void usingAsQueue() {
        Deque<Integer> queue=new ArrayDeque<>();
        System.out.println("队列为空:"+queue.isEmpty());   //判断队列是否为空
        queue.addLast(12);   //添加元素
        System.out.println("队列为空:"+queue.isEmpty());   //判断队列是否为空
        System.out.println(queue.peekFirst());   //获取队列首部元素
        System.out.println(queue.pollFirst());   //获取并移除栈顶元素
        System.out.println("队列为空:"+queue.isEmpty());   //判断队列是否为空
 }

private static void usingAsStack() {
        //作为栈使用
        Deque<Integer> stack=new LinkedList<>();
        System.out.println("栈为空:"+stack.isEmpty());   //判断栈是否为空
        stack.addFirst(12);
        System.out.println("栈为空:"+stack.isEmpty());   //判断栈是否为空
        System.out.println(stack.peekFirst());   //获取栈顶元素
        System.out.println(stack.pollFirst());   //获取并移除栈顶元素
        System.out.println("栈为空:"+stack.isEmpty());   //判断栈是否为空
        System.out.println("============================================");

结果:

栈为空:true
栈为空:false
12
12
栈为空:true
队列为空:true
队列为空:false
12
12
队列为空:true

### Java Deque 接口概述 Deque(双端队列),全称为 "Double Ended Queue",是Java集合框架中的一种数据结构,在`java.util`包下定义。这种数据结构允许在队列的两端进行元素的插入和删除操作[^1]。 #### 方法特性 Deque不仅支持传统的队列操作(FIFO),还能够执行的操作(LIFO)[^1]。因此,它提供了一系列丰富的API用于处理不同场景下的需求: - `addFirst(E e)` 和 `addLast(E e)`:分别向双端队列的开头或结尾添加指定元素; - `offerFirst(E e)` 和 `offerLast(E e)`:功能同上,但在无法成功加入时返回false而不是抛出异常; - `removeFirst()` 和 `removeLast()`:移除并返回双端队列的第一个或最后一个元素; - `pollFirst()` 和 `pollLast()`:类似于上述两个函数的行为,但如果队列为空则返回null而非抛出NoSuchElementException; - `getFirst()` 和 `getLast()`:获取但不移除第一个或最后一个元素;如果队列为空,则会引发NoSuchElementException; - `peekFirst()` 和 `peekLast()`:同样用来查看头尾元素,不过当队列为空时不报错而是给出null值。 这些方法使得开发者可以根据实际应用场景灵活选用最合适的操作方式来管理队列内的项目。 #### 实现类及其特点 对于Deque接口的具体实现,Java提供了多种选择以适应不同的性能考量和同步需求: - **ArrayDeque**: 基于动态数组的数据结构,适用于频繁访问中间位置的情况,但是不适合多线程环境因为其不具备内在锁机制[^2]。 - **LinkedList**: 双向链表形式存储节点信息,除了能高效完成增删改查外还可以充当列表角色参与更多类型的容器操作[^4]。 - **ConcurrentLinkedDeque**: 针对并发编程设计而成的安全版本,内部采用无阻塞算法保证高吞吐量的同时维持良好的响应速度。 下面通过一段简单的代码展示如何利用Deque的不同特性和具体实例化对象来进行基本操作: ```java import java.util.ArrayDeque; import java.util.Deque; public class DequeExample { public static void main(String[] args) { // 创建一个基于ArrayDequeDeque实例 Deque<String> deque = new ArrayDeque<>(); // 向deque中添加元素 deque.addFirst("first"); deque.offerLast("last"); System.out.println(deque); // 输出当前状态 String firstElement = deque.pollFirst(); System.out.println(firstElement); System.out.println(deque); // 查看而不取出最后面的一个元素 String lastPeeked = deque.peekLast(); System.out.println(lastPeeked); System.out.println(deque); } } ``` 此程序片段展示了创建Deque实例的过程以及一些常用方法的应用情况,包括但不限于添加、检索及预览元素等功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值