iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中队列Queue和Deque的区别与代码实例
  • 117
分享到

Java中队列Queue和Deque的区别与代码实例

2024-04-02 19:04:59 117人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、Queue和Deque二、api对比三、代码实例1、queue2、deque总结一、Queue和Deque Queue以及Deque都是继承于Collection,Dequ

一、Queue和Deque

Queue以及Deque都是继承于Collection,Deque是Queue的子接口。

Queue是FIFO的单向队列,Deque是双向队列。

Queue有一个直接子类PriorityQueue,而Deque中直接子类有两个:LinkedList以及ArrayDeque。

PriorityQueue的底层数据结构数组,而无边界的形容,那么指明了PriorityQueue是自带扩容机制的。

ArrayDeque是无初始容量的双端队列,LinkedList则是双向链表

PriorityQueue可以作为堆使用,而且可以根据传入的Comparator实现大小的调整,会是一个很好的选择。
ArrayDeque通常作为栈或队列使用,但是栈的效率不如LinkedList高。
LinkedList通常作为栈或队列使用,但是队列的效率不如ArrayQueue高。

二、api对比

Queue Deque
增加 add add、addFirst、addLast
offer offer、offerFirst、offerLast
移除 remove remove、removeFirst、removeLast
poll pop、poll、pollFirst、pollLast
获取 element element、getFirst、getLast
peek peek、peekFirst、peekLast

备注:

1、add和offer区别

  • add() : 添加元素,如果添加成功则返回true,如果队列是满的,则抛出异常
  • offer() : 添加元素,如果添加成功则返回true,如果队列是满的,则返回false

2、remove和poll

  • remove() : 移除队列头的元素并且返回,如果队列为空则抛出异常
  • poll() : 移除队列头的元素并且返回,如果队列为空则返回null
  • Deque新增了一个pop方法,也是移除队列头的元素并且返回,如果队列为空则抛出异常。

3、element和peek

  • element() :返回队列头元素但不移除,如果队列为空,则抛出异常
  • peek() :返回队列头元素但不移除,如果队列为空,则返回null
  • 因此,增加推荐使用add,移除推荐使用poll,获取元素推荐使用peek。

三、代码实例

1、queue

队列(queue)是一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结构遵循的先进先出原则。Java中,LinkedList实现了Queue接口,因为LinkedList进行插入、删除操作效率较高。

初始化:

Queue <Integer> q = new LinkedList<Integer>();

常用方法:

**add(E e)😗*将指定元素插入此队列尾部,成功返回true。

**offer(E e)😗*将指定元素插入队列尾部,成功返回true。当队列有容量 限制时,此方法由于add,因为后者可能无法插入,而只是抛出IllegalStateException异常。

**remove()😗*获取并移除队列的头部元素,队列为空抛出异常。

**poll():**获取并移除队列的头部元素,队列为空返回null。

**element()😗*获取但是不移除队列头部元素,队列为空抛出异常。

**peek()😗*获取但是不移除队列头部元素,队列为空返回null。

**isEmpty()😗*判断队列是否为空,为空返回true。

**size()😗*获取队列元素数量.

实例代码:


public static void test01(){
    Queue<String> queue = new LinkedList<>();
    // add()和remove()方法在失败的时候会抛出异常(不推荐)
    queue.offer("a");
    queue.offer("b");
    queue.offer("c");
    queue.offer("d");
    queue.offer("e");
    queue.add("f");
    //在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll() 方法只会返回 null 。
    String first2 = queue.remove();//返回第一个元素,删除
    System.out.println(first2);//a
    String first1 = queue.poll();//返回第一个元素,删除
    System.out.println(first1);//b
    String first = queue.peek();//返回第一个元素,但不删除
    System.out.println(first);//c
    System.out.println(queue);//[c, d, e, f]
    first = queue.element();//返回第一个元素
    System.out.println(first);//c
}

2、deque

双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队和出队,则可实现栈的数据结构。对于栈而言,有入栈(push)和出栈(pop),遵循先进后出原则。

初始化:

Deque<Integer> d = new LinkedList<Integer>();

常用方法:

**addLast(E e)😗*在队列尾部插入元素.

**offerLast(E e)😗*在队列尾部插入元素。

**removeFirst()😗*获取头部元素。

**pollFirst()😗*获取头部元素。

**getFirst()😗*获取头部元素。

**peekFirst()😗*获取头部元素。

//上述方法均和queue中方法一一对应。
//且queue中的方法,deque中均可用。

**getLast()😗*获取但不移除队列最后一个元素。

**offerFirst()😗*将指定元素插入队列开头。

**peekLast()😗*获取但不移除双端队列最后一个元素。

**pollLast()😗*获取并移除双端队列最后一个元素。

**pop()😗*从双端队列表示的堆栈 中弹出一个元素。

**push()😗*将一个元素推入双端队列表示的堆栈,即队列的头部。成功返回true,如果没有可用空间,抛出IllegalStateException。

**removeLast()😗*获取并移除移除双端队列最后一个元素。

**size()😗*返回双端队列元素数。

**isEmpty()😗*判断队列是否为空,为空返回true。

**remove(Object o)😗*从双端队列中移除第一次出现的指定元素。

实例代码:


public static void test02(){
    Deque<String> deque = new LinkedList<>();
    deque.offer("a");
    deque.offer("b");
    deque.offerFirst("c");//在队列头部进行插入
    System.out.println(deque);//[c, a, b]
    deque.offerLast("d");
    System.out.println(deque);//[c, a, b, d]
 
    String ret = deque.element();//返回第一个元素
    System.out.println(ret);//c
 
    ret = deque.getFirst();//返回第一个元素
    System.out.println(ret);//c
    ret = deque.getLast();//返回最后一个元素
    System.out.println(ret);//d
 
    ret = deque.peek();//返回第一个元素,但不删除
    System.out.println(ret);//c
 
    ret = deque.peekFirst();//返回第一个元素,但不删除
    System.out.println(ret);//c
    ret = deque.peekLast();//返回最后一个元素,但不删除
    System.out.println(ret);//d
 
    System.out.println(deque);
 
    ret = deque.poll();//返回第一个元素,删除
    System.out.println(ret);//c
    System.out.println(deque);//[a, b, d]
 
    ret = deque.pop();//返回第一个元素,删除
    System.out.println(ret);//a
    System.out.println(deque);//[b, d]
 
    deque.clear();
    ret = deque.pop();//抛异常
    System.out.println("11111");
    ret = deque.poll();//返回null,但不抛异常
    System.out.println("++"+ret);
    System.out.println("22222");
}

总结

到此这篇关于Java中队列Queue和Deque区别的文章就介绍到这了,更多相关Java队列Queue和Deque区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中队列Queue和Deque的区别与代码实例

本文链接: https://www.lsjlt.com/news/133041.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中队列Queue和Deque的区别与代码实例
    目录一、Queue和Deque二、api对比三、代码实例1、queue2、deque总结一、Queue和Deque Queue以及Deque都是继承于Collection,Dequ...
    99+
    2024-04-02
  • Java代码实现循环队列的示例代码
    循环队列结构 队列特点 队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受...
    99+
    2024-04-02
  • Python中的Deque: 实现高效的队列和堆栈
    Python 中的 deque 是一个低级别的、高度优化的双端队列,对于实现优雅、高效的Pythonic 队列和堆栈很有用,它们是计算中最常见的列表式数据类型。本文中,云朵君将和大家一起学习如下:开始使用deque有效地弹出和追加元素访问d...
    99+
    2023-05-14
    Python 队列
  • Java循环队列与非循环队列的区别总结
    非循环循环队列 判满:(rear+1) % maxsize == front 判空:front == rear 队列元素个数:rear = (rear + ...
    99+
    2024-04-02
  • C++中队列queue的用法实例详解
    目录一、定义一、queue初始化二、queue常用函数补充:queue 的基本操作举例如下总结一、定义 queue是一种容器转换器模板,调用#include< queue>...
    99+
    2024-04-02
  • Java中栈和队列有什么区别
    这期内容当中小编将会给大家带来有关Java中栈和队列有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面...
    99+
    2023-06-14
  • Laravel实现队列的示例代码
    目录一:队列配置1:队列相关配置2:不同队列依赖二:创建队列任务三:任务分发1:默认分发2:延时分发3:指定队列分发4:指定驱动分发5:指定驱动和队列分发四:任务处理五:失败任务处理...
    99+
    2023-02-10
    Laravel实现队列 Laravel 队列
  • java中用数组实现环形队列的示例代码
    本篇文章主要讲述了使用数组实现环形队列的思路以及具体代码 一、队列是什么 我们先来看下百科的解释: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,...
    99+
    2024-04-02
  • RabbitMQ延时队列详解与Java代码实现
    目录RabbitMQ 延时队列介绍使用插件实现延时队列使用DLX机制实现延时队列Java语言设置延时队列安装插件创建延时交换机创建延时队列发送延时消息消费延时消息RabbitMQ延时...
    99+
    2023-05-18
    Java实现延时队列 RabbitMQ延时队列
  • java数据结构中顺序队列和循环队列的区别是什么
    这篇文章主要介绍“java数据结构中顺序队列和循环队列的区别是什么”,在日常操作中,相信很多人在java数据结构中顺序队列和循环队列的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java数据结构中...
    99+
    2023-06-20
  • Java利用Redis实现消息队列的示例代码
    本文介绍了Java利用Redis实现消息队列的示例代码,分享给大家,具体如下:应用场景为什么要用redis?二进制存储、java序列化传输、IO连接数高、连接频繁一、序列化这里编写了一个java序列化的工具,主要是将对象转化为byt...
    99+
    2023-05-31
    java redis 消息队列
  • Java的栈和队列实例分析
    这篇文章主要讲解了“Java的栈和队列实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的栈和队列实例分析”吧!栈package com.yuzhenc.collect...
    99+
    2023-06-29
  • 消息队列 RabbitMQ 与 Spring 整合使用的实例代码
    一、什么是 RabbitMQRabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送...
    99+
    2023-05-31
    rabbitmq spring
  • Java消息队列的简单实现代码
    今天看到我们的招聘信息有对消息队列有要求,然后就思索了一翻,网上一搜一大堆。我可以举个小例子先说明应用场景假设你的服务器每分钟的处理量为200个,但客户端再峰值的时候可能一分钟会发1000个消息给你,这时候你就可以把他做成队列,然后按正常有...
    99+
    2023-05-31
    java 消息队列 ava
  • java线程池工作队列饱和策略代码示例
    线程池(Thread Pool) 是并行执行任务收集的实用工具。随着 CPU 引入适合于应用程序并行化的多核体系结构,线程池的作用正日益显现。通过 ThreadPoolExecutor类及其他辅助类,Java 5 引入了这一框架,作为新的并...
    99+
    2023-05-30
    java 线程池 队列
  • C#中的Task.Delay()和Thread.Sleep()区别(代码案例)
    一、简介 1.Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。 2.Thread.Sleep()会阻塞线程,Task.Delay()不会。 3.Threa...
    99+
    2024-04-02
  • PHP实现RabbitMQ消息列队的示例代码
    目录业务场景1、首先部署好thinkphp6框架2、安装workerman扩展3、生产者4、消费者5、整体测试业务场景 项目公司是主php做开发的,框架为thinkphp。众所周知,...
    99+
    2024-04-02
  • C语言设计前中后队列实例代码
    目录队列基本概念1,数组实现 2,链表实现 总结队列基本概念 队列是最常见的概念,日常生活经常需要排队,仔细观察队列会发现,队列是一种逻辑结构,是一种特殊的线性表。特殊在: 只能在固...
    99+
    2024-04-02
  • Java语言通过三种方法实现队列的示例代码
    目录队列图解数组模拟队列队列优化—循环队列代码使用java内部队列代码队列 队列是一种特殊的线性表,只允许在表的前端进行删除操作,在表的后端进行插入操作。队列是一个有序列...
    99+
    2024-04-02
  • Java实现线程插队的示例代码
    目录多线程5(线程插队)1.题目2.解题思路3.代码详解多线程5(线程插队) 1.题目 在编写多线程的业务时,会遇到让一个线程优先于其他线程运行的情况,除了可以设置线程的优先级高于其...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作