Java Deque基本概念和使用方法

 更新时间:2025年03月05日 11:49:12   作者:飞滕人生TYF  
Deque双端队列是Java Collections Framework的一部分,支持在两端插入和删除操作,它继承自Queue接口,可以作为队列FIFO或栈LIFO使用,本文介绍java Deque基本概念和使用方法,感兴趣的朋友一起看看吧

在 Java 中,Deque(双端队列)是一个支持在两端插入和删除的队列。它是 Java Collections Framework 的一部分,通过接口和实现类提供了高效的双端操作能力。

Deque 基础概念

  • Deque双端队列,支持在队列的 头部尾部 添加、删除、访问元素。
  • 它继承自 Queue 接口,是一种更加通用的数据结构。
  • 既可以用作 队列(FIFO),也可以用作 栈(LIFO)

接口定义

Deque 是一个接口,常用实现类有:

  • ArrayDeque:基于动态数组的双端队列实现。
  • LinkedList:基于双向链表的双端队列实现。

常见操作分类

  • 头部操作addFirstremoveFirstgetFirst
  • 尾部操作addLastremoveLastgetLast
  • ​​​​​​​通用队列操作offerpollpeek

Deque 的方法详解

1. 添加元素

在头部添加

  • void addFirst(E e):在队列头部插入元素,若队列满则抛出异常。
  • boolean offerFirst(E e):在队列头部插入元素,若队列满返回 false

在尾部添加

  • void addLast(E e):在队列尾部插入元素,若队列满则抛出异常。
  • boolean offerLast(E e):在队列尾部插入元素,若队列满返回 false

示例:

Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1); // 在头部添加
deque.addLast(2);  // 在尾部添加
System.out.println(deque); // 输出:[1, 2]

2. 删除元素

从头部删除

  • E removeFirst():删除并返回头部元素,若队列为空则抛出异常。
  • E pollFirst():删除并返回头部元素,若队列为空返回 null

从尾部删除

  • E removeLast():删除并返回尾部元素,若队列为空则抛出异常。
  • E pollLast():删除并返回尾部元素,若队列为空返回 null

示例:

Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1);
deque.addLast(2);
deque.removeFirst(); // 删除头部元素
deque.removeLast();  // 删除尾部元素
System.out.println(deque); // 输出:[]

3. 访问元素

访问头部元素

  • E getFirst():获取但不删除头部元素,若队列为空则抛出异常。
  • E peekFirst():获取但不删除头部元素,若队列为空返回 null

访问尾部元素

  • E getLast():获取但不删除尾部元素,若队列为空则抛出异常。
  • E peekLast():获取但不删除尾部元素,若队列为空返回 null。 示例:
Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1);
deque.addLast(2);
System.out.println(deque.getFirst()); // 输出:1
System.out.println(deque.getLast());  // 输出:2

4. 栈操作(LIFO)

  • void push(E e):将元素压入栈顶(相当于 addFirst)。
  • E pop():移除并返回栈顶元素(相当于 removeFirst)。

示例:

Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); // 压入栈顶
stack.push(2);
System.out.println(stack.pop()); // 弹出栈顶元素,输出:2
System.out.println(stack.pop()); // 输出:1

5. 队列操作(FIFO)

  • boolean offer(E e):将元素添加到队列尾部(相当于 offerLast)。
  • E poll():移除并返回队列头部元素(相当于 pollFirst)。
  • E peek():获取但不删除队列头部元素(相当于 peekFirst)。

示例:

Deque<Integer> queue = new ArrayDeque<>();
queue.offer(1); // 添加到尾部
queue.offer(2);
System.out.println(queue.poll()); // 移除头部元素,输出:1
System.out.println(queue.peek()); // 获取头部元素,输出:2

6. 删除所有元素

  • void clear():清空队列。

示例:

Deque<Integer> deque = new ArrayDeque<>();
deque.add(1);
deque.add(2);
deque.clear(); // 清空队列
System.out.println(deque.isEmpty()); // 输出:true

7. 检查队列状态

  • boolean isEmpty():检查队列是否为空。
  • int size():返回队列中元素的数量。

Deque 的实现类

1. ArrayDeque

  • 基于动态数组实现。
  • 特点
    • 适合用作栈和队列。
    • 线程不安全,但效率较高。
    • 不允许存储 null 元素。

示例:

Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1);
deque.addLast(2);
System.out.println(deque); // 输出:[1, 2]

2. LinkedList

  • 基于双向链表实现。
  • 特点
    • 支持队列和栈操作。
    • 允许存储 null 元素。
    • 适合频繁插入和删除操作的场景。

示例:

Deque<Integer> deque = new LinkedList<>();
deque.addFirst(1);
deque.addLast(2);
System.out.println(deque); // 输出:[1, 2]

常见应用场景

1. 栈实现(LIFO 模式)

Deque 提供了 pushpop 方法,可以方便地模拟栈。

示例:

Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
stack.push(2);
System.out.println(stack.pop()); // 输出:2
System.out.println(stack.pop()); // 输出:1

2. 队列实现(FIFO 模式)

Deque 提供了 offerpoll 方法,可以模拟队列操作。

示例:

Deque<Integer> queue = new ArrayDeque<>();
queue.offer(1);
queue.offer(2);
System.out.println(queue.poll()); // 输出:1
System.out.println(queue.poll()); // 输出:2

3. 滑动窗口

Deque 可以用作维护滑动窗口的数据结构,例如最大值或最小值的计算。

4. 双端处理

Deque 支持从两端同时处理数据,例如支持同时从头尾访问元素的算法(如回文检查)。

总结

方法分类常用方法描述
添加元素addFirstaddLastoffer向头部或尾部添加元素
删除元素removeFirstremoveLast从头部或尾部删除元素
访问元素getFirstgetLastpeek获取头部或尾部元素,但不删除
栈操作pushpop用作栈的 LIFO 操作
队列操作offerpollpeek用作队列的 FIFO 操作
清空队列clear删除所有元素

推荐使用场景

  • 对于简单的栈或队列操作,使用 ArrayDeque
  • 对于需要频繁插入、删除或允许存储 null 的场景,选择 LinkedList

Deque 是一个功能强大的双端数据结构,在队列和栈操作中非常灵活。根据实际需求选择实现类即可。

到此这篇关于java Deque 详解的文章就介绍到这了,更多相关java Deque 详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot 中使用 JSON Schema 校验复杂JSON数据的过程

    Spring Boot 中使用 JSON Schema 校验复杂JSO

    在数据交换领域,JSON Schema 以其强大的标准化能力,为定义和规范 JSON 数据的结构与规则提供了有力支持,下面给大家介绍Spring Boot 中使用 JSON Schema 校验复杂JSON数据的过程,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • Java数据结构中的HashMap和HashSet详解

    Java数据结构中的HashMap和HashSet详解

    HashMap和HashSet都是存储在哈希桶之中,通过本文我们可以先了解一些哈希桶是什么,本文结合实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10
  • SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本)

    SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本)

    这篇文章主要介绍了SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • SpringCloud Function SpEL注入漏洞分析及环境搭建

    SpringCloud Function SpEL注入漏洞分析及环境搭建

    SpringCloud 是一套分布式系统的解决方案,常见的还有阿里巴巴的Dubbo,Fass的底层实现就是函数式编程,SpringCloud Function 就是Spring提供的分布式函数式编程组件,下面给大家介绍下SpringCloud Function SpEL注入漏洞分析,感兴趣的朋友一起看看吧
    2022-04-04
  • 如何修改nacos权重报错问题

    如何修改nacos权重报错问题

    这篇文章主要介绍了如何修改nacos权重报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 关于java关键字this和super的区别和理解

    关于java关键字this和super的区别和理解

    这篇文章主要给大家介绍了关于java关键字this和super的区别和理解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详解SpringMVC如何进行数据回显

    详解SpringMVC如何进行数据回显

    这篇文章主要介绍了详解SpringMVC如何进行数据回显,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • java读取PHP接口数据的实现方法

    java读取PHP接口数据的实现方法

    下面小编就为大家带来一篇java读取PHP接口数据的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java判断字符串是否是有效的括号(实例详解)

    Java判断字符串是否是有效的括号(实例详解)

    给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效,有效字符串需要满足:左括号必须用相同类型的右括号闭合,这篇文章主要介绍了Java判断字符串是否是有效的括号,需要的朋友可以参考下
    2023-10-10
  • Java源码解析之平衡二叉树

    Java源码解析之平衡二叉树

    在上一章的文章中,我们讲到了二叉排序树,它很好的平衡了插入与查找的效率,但二叉排序树如果不平衡,那么查找效率就会大大降低,今天要讲的这个平衡二叉树就是一种解决这个问题的方法.需要的朋友可以参考下
    2021-05-05

最新评论