我最近一直在研究一些需要堆栈和队列的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中的堆栈和队列相关推荐

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

    java 队列和堆栈 我最近一直在研究一些需要堆栈和队列的Java代码. 使用的选择不是立即显而易见的. 有一个Queue接口,但没有明确的具体实现要使用. 还有一个Stack类,但是javadocs ...

  2. 万能的list列表,python中的堆栈、队列实现全靠它

    在python编程中很多的数据计算都需要依靠列表来实现,比如Java编程中的堆栈结构/队列结构也可以通过list列表实现的. [阅读全文] 1.将列表当做堆栈来使用 堆栈数据结构实现的思想就是:'先进 ...

  3. Java中的5大队列,你知道几个?

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 通过前面文章的学习<一文详解「队列」,手撸队列的3种方法!>我们知道了队列(Queue)是先进先出(FIFO)的,并 ...

  4. 如何在JavaScript中实现堆栈和队列?

    本文翻译自:How do you implement a Stack and a Queue in JavaScript? What is the best way to implement a St ...

  5. java add offer_图解Java中的5大队列!(干货收藏)

    Java 中的队列有很多,例如:ArrayBlockingQueue.LinkedBlockingQueue.PriorityQueue.DelayQueue.SynchronousQueue等,那它 ...

  6. java中的数组、队列、堆栈

    声明一个数组 Java代码 String[] aArray = new String[5]; String[] bArray = {"a","b"," ...

  7. Java中的堆栈安全递归

    在本文中,摘自< Java中的函数式编程 >一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险. Corecursion正在使用第一步的输出作为下一步的输入来构成计 ...

  8. Java中的PriorityQueue优先级队列

    以前的博客中介绍过队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,此时出队列时需要优先级高的元素先出队列,这个时候传统的队列显然不能胜任,Java中有一个新的实现类继 ...

  9. Java将一个堆栈进行反转,如何使用Java中的堆栈反转数组的元素?

    堆栈是一种抽象数据类型(ADT),通常在大多数编程语言中使用.它被称为堆栈,因为它的行为类似于现实世界中的堆栈,例如,一副纸牌或一堆盘子等. 堆栈是先进先出的,它具有两个主要操作push和pop.Pu ...

最新文章

  1. 一次expdp 错误的分析处理
  2. 程序员数学基础【二、时间复杂度】(Python版本)
  3. php 函数参数 引用,php 函数参数的引用
  4. 【原】Mysql存储关联数组
  5. 分布式SQL学习总结(2)——TiDB 的现在和未来
  6. sql server 入门_SQL Server中的数据挖掘入门
  7. 加载等待loading
  8. Linux内核系统调用原理与实现
  9. 如何解决aar中的第三方依赖无法调用问题
  10. 3ds Max: Substance to V-Ray Workflows 3ds Max教程:从Substance到V-Ray工作流程 Lynda课程中文字幕
  11. 北美票房:《触不可及》惊喜夺冠
  12. 做网站必备!该文介绍下国内服务器与国外服务器的区别
  13. 迅雷 android下载地址 http,Android HTTP边下边播
  14. 顶尖文案app_17个文案网站 5款短视频软件,自媒体人必备,直接拿走不谢
  15. 帮忙改一下狼人杀的错T_T
  16. android swstnw cn,Android应用开发之ubuntu14.04编译ijkplayer备忘
  17. React 中 Twitter 的 SVG 图标 (icons)
  18. 第三代测序技术在微生物研究中的应用
  19. 小米9se用twrp刷机时,出现persist挂载失败,导致系统启动不了的解决方法
  20. ubuntu server 14.04 编译安装xen4.4.2配置vtpm(一)——xen4.4.2源码编译安装

热门文章

  1. 记录一下SpringCloud-Gateway使用lb动态路由遇到的坑
  2. i18n国际化登录页面
  3. 托管 非托管_如何在托管Kubernetes上还原Neo4J备份
  4. java 键入_在Java中键入Safe SQL
  5. spring health_为什么Spring的Health会再次向下,向下,向上,向上,向上和向下?...
  6. java流写入数据库_Java 8:在2分钟内将智能流与数据库一起使用
  7. python antlr_使用ANTLR在5分钟内用Java解析任何语言:例如Python
  8. java开发错误_每个Java开发人员都必须避免的9个安全错误
  9. JPA @Embeddable和@Embedded
  10. Java开发人员应该知道的5大Spring Boot功能