java 队列和堆栈_Java中的堆栈和队列

java 队列和堆栈

我最近一直在研究一些需要堆栈和队列的Java代码。 使用的选择不是立即显而易见的。 有一个Queue接口,但没有明确的具体实现要使用。 还有一个Stack类,但是javadocs指出其他类“应该优先于此类使用”。 那么,您对Java中的堆栈和队列使用哪种实现?

我发现我的经验法则是可以将ArrayDeque类同时用于Stack和Queues,但下面提供了更多详细信息。

通用定义

首先,让我们从一些定义开始。 在该词的常用用法中,队列是FIFO(先进先出)。 就像在邮局排队的第一个人一样。 堆栈为LIFO(后进先出)。 想象一堆书–您放在书堆中的最后一本书是您摘下的第一本书。

Java中的选择

在Java中,情况稍微复杂一些,但原理相同。 有前面提到的Queue接口,该接口具有添加,删除和查看元素的预期方法。 (实际上,这些方法有两种形式:一种在操作失败时引发异常,另一种返回特殊值,例如null或false;请参见此处 )。

还有一个名为Deque的Queue子接口,它是“双头队列”的缩写,通常发音为“ deck”。 该接口定义访问集合两端的元素的方法。 此功能使Deque成为队列和堆栈实现的有用基础。

但是,Queue和Deque都是接口,因此我们仍然没有找到要使用的具体实现…

候选清单:ArrayDeque和LinkedList

2个主要选择是: ArrayDeque和LinkedList 。 Deque还有其他一些实现,例如ConcurrentLinkedDeque和LinkedBlockingDeque,以及大量的Queue实现,例如DelayQueue,LinkedBlockingDeque和PriorityQueue。 由于这些功能较为专业(而且我使用的并不多),因此我不再赘述。

ArrayDeque

从javadocs开始 ,ArrayDeque是Deque接口的可调整大小的数组实现。 除remove *,contains *和bulk操作外,大多数ArrayDeque操作均以摊销的固定时间运行(即“偶尔”,但平均为常数),所有操作均以线性时间运行。 文档指出,此类用作堆栈时,可能比Stack快,而用作队列时,则比LinkedList快。 这条语句使我使用ArrayDeque作为堆栈和队列的默认实现。

链表

LinkedList类实现List,Queue和Deque接口。 除了实现List接口之外,LinkedList类还提供统一命名的方法,以获取,删除和在列表的开头和结尾插入元素。 这些操作允许将链接列表用作堆栈,队列或双端队列。

LinkedList与ArrayDeque

因此,何时使用ArrayDeque上的LinkedList?

LinkedList实现的优点是:

  • 比ArrayDeque实现更灵活,因为它
    • 实现所有可选的列表操作。
  • 非常适合需要频繁删除/插入列表中间的项目(某些情况可能会导致ArrayDeque的大型数组副本)。

LinkedList实现的缺点:

  • 一般而言,在迭代项目时并不理想
  • 比ArrayDeque实现消耗更多的内存

总体

在效率方面,ArrayDeque比LinkedList在两端进行迭代和添加/删除操作效率更高。 因此,正如javadocs所指出的那样,通常,在用作堆栈时,ArrayDeque可能比堆栈快,而当用作队列时,则比LinkedList快。

参考:来自Shaun Abram博客博客的JCG合作伙伴 Shaun Abram的Java堆栈和队列 。

翻译自: https://www.javacodegeeks.com/2013/10/stacks-and-queues-in-java.html

java 队列和堆栈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dbassit 包_CELINE新包,篮子包、圆盒包、腋下包、托特包等

CELINE 2021春夏女装系列以纪录片形式发布,由创意总监 Hedi Slimane 执导并设计配乐,在摩纳哥路易二世体育场取景。CELINE 2021春夏时装秀本季作品以「一代人的肖像」为题,在复古优雅中融入富有街头感的运动元素。CELINE 2021春夏时装秀女孩们…

Php数组面包屑导航,php可应用于面包屑导航的迭代寻找家谱树实现方法

php是通过定义类来实现迭代器接口来构造迭代器,通过yield构造迭代器可以提高性能并节省系统开销,下面就跟着爱站技术频道小编的步伐来学习php可应用于面包屑导航的迭代寻找家谱树实现方法吧。具体实现方法如下:echo "";$area arra…

bootstrap 悬浮固定_CST Tech Tips - 流式细胞术中如何固定和通透细胞?

CST TECH TIPS 系列课程 欢迎关注「CST博士互助平台」 有关流式细胞术(Flow Cytometry,FCM)实验步骤中的固定和通透化,你需要了解什么?进行流式细胞术,如果你所有的靶标均在外表面表达,那么可使用活细胞。但当你靶向胞…

php按钮css样式,CSS 按钮

CSS 按钮本章节我们为大家介绍使用 CSS 来制作按钮。我们先看一下默认按钮和用css制作的按钮html>php中文网(php.cn).button {background-color: #4CAF50;border: none;color: white;padding: 15px 32px;text-align: center;text-decoration: none;display: inline-block;fo…

电脑网络维护_电脑维护小技巧(全面)

如果你真的想了解,请耐心看完,都是干货电脑使用维护小技巧1、电脑为何莫名奇妙多了那么多软件呢? 有的人在使用电脑时候会经常发现,电脑无缘无故会冒出很多不知道的软件,“没见过、不是我下载的、卸载不掉”&#xff0…

自动装箱自动拆箱java,自动装箱?拆箱?==问题?详解java面试常见的一个问题...

1:前言相信大家都在面试中都被问到过一个问题,这个问题也是近年来面试官刁难人比较常见的一个问题,所以也被大家所熟知了,本质上也很简单,但是也是非常基础的一个题目。Integer a 100;Integer b 100;System.out.prin…

javafx 加载_JavaFX 2:如何加载图像

javafx 加载这是有关如何在JavaFX 2应用程序中加载图像的JavaFX教程。 使用ImageView可以轻松完成此操作。 ImageView是一个节点,用于绘制加载有Image类的图像。 因此,您将首先使用Image类加载图像,然后使用ImageView显示它。 我还将在这里演…

Juniper 210 密码清不掉_工程人不会看图纸?210页建筑识图详细教程,把你教得明明白白...

工程人不会看图纸?210页高清建筑识图详细教程,把你教得明明白白身为工程人,看不懂图纸有多可怕?可以说,举步维艰,寸步难行!将复杂的图纸最简单化,这是我们工程人学会建筑识图的目的和…

couchbase_使用Couchbase分页

couchbase如果在对Couchbase集群进行查询时必须处理大量文档,则使用分页来逐页获取行很重要。 您可以在“ 分页 ”一章的文档中找到一些信息,但是我想在本文中详细介绍示例代码。 在此示例中,我将基于啤酒样本数据集创建一个简单的视图&…

Network下方什么请求也没有_今日头条上传图片时设置封面图报像素低的原因是什么...

今日头条发表原创图文时,在设置文章封面三张图时,有时候会遇到错误信息“部分图片实际像素低于172*120, 不支持设置为封面”。然而我上传的每张图片都是大小超过4MB的高清晰图片,怎么可能像素低于172 * 120? 因为我是个程序猿,所…

php提前用户系统时间限制,php date()比服务器时间提前一小时(DST问题)

我正在尝试排除故障并解决此问题:我正在使用的服务器(Linux上的PHP5.2.9)具有正确的本地时间(美洲/布宜诺斯艾利斯):userserver [/home/site/public_html]$ dateMon Nov 1 17:11:14 ART 2010php.ini设置为date.timezone "America/Buenos_Aires"ini_set(display_erro…

单缝衍射matlab,MATLAB模拟光的单缝衍射

我使用32位R2012a版,32位windows 7系统模拟此程序时第一句出现错误,不知道是什么原因。第一次学习使用MATLAB,希望老师们能帮助,谢谢您们。function Varargoutmygui_1002(varargin)gui_Singleton1;gui_Statestruct(gui Name, mf…

认识适配器:JSON绑定概述系列

适配器通过实现JsonbAdapter接口来配置自定义对象的创建和序列化。 方法AdaptToJson()和AdaptFromJson()被执行序列化和反序列化操作的逻辑覆盖。 下一篇文章介绍了使用自定义序列化器和反序列化器自定义JSON-B的最高级方法。 在…

微软新浏览器_要超越Chrome?微软新发布的这款浏览器,有翻天覆地的变化!

可爱的分割线系统迷还记得,当年Edge浏览器刚发布的时候,真的是备受期待。可惜的是,由于其糟糕的体验,以及不完善的插件,最终让它变成了第二个IE。可能是出于无奈,微软选择放弃自家渲染引擎,改用…

centos mount 用法_linux screen的用法 - mouseleo

12016.04.02 17:34:56字数 1,019阅读 26,104大家在初次接触linuxVPS时,会发现linux操作和windows操作太不相同的,windows都是图形操作界面,而linux一般是命令行操作,当然,linux也有图形操作界面,但是我们在…

php memcache 封装类,php 封装memcache类

/** memcache类*/class Memcacheds{//声明静态成员变量private static $m null;private static $cache null;private function __construct() {self::$m new Memcache();self::$m->connect(www.cat.com,11211); //写入缓存地址,端口}//为当前类创建对象private static fu…

jedis入门_Jedis入门

jedis入门嗨,这些天我开始研究Redis。 我听说过很多,所以我决定尝试一下。 Redis在其网站上定义为“ 开源高级键值存储”。 它通常被称为数据结构服务器,因为键可以包含字符串,哈希,列表,集合和排序集合 。…

电脑动态壁纸_每日壁纸—水彩插画少女动漫手机高清无水印壁纸第二波

- End -猜你喜欢:看新闻竟然可以赚钱???朋友圈千万别设置三天可见!哈哈哈~圣诞节,你收到过的奇葩礼物是什么?教你玩赚支付宝红包攻略,如何领大额红包!!&#…

php赋值 jq,使用js和jQuery如何实现指定赋值方法

下面我就为大家分享一篇js和jQuery以及easyui实现对下拉框的指定赋值方法,具有很好的参考价值,希望对大家有所帮助。js实现:1. 通过让第i个option为selected实现选中第i个,代码如下:(id为下拉框id)(1) document.getEle…

混合云的承诺,收益和产品

云承诺将为我们提供所有灵活性。 有机会在需要时访问无限资源并相应地付款。 我们将不再需要花费时间安装,配置和维护服务器。 我们被承诺将有更多的时间来“仅仅编码”。 取而代之的是,我们越来越多地锁定供应商,而少数云服务商如此之大&am…