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 队列和堆栈

java 队列和堆栈_Java中的堆栈和队列相关推荐

  1. java 队列已满_JAVA中常见的阻塞队列详解

    在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...

  2. java 递归 堆栈_Java中的堆栈安全递归

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

  3. java堆栈_java线程的堆栈跟踪之jstack篇

    该命令打印java线程的堆栈跟踪,可以得知哪些线程被阻塞或正等待,以便于查找如线程死锁的原因 用法: jstack [ option ] pid jstack [ option ] executabl ...

  4. java队列怎么实现线程_Java中利用线程和队列实现入库操作

    Java单线程中,如果需要大量的数据库操作,会在IO方面产生瓶颈,特别是数据库连接失败时,大量资源会消耗在数据库连接的检测上,从而使程序的实时响应速度变慢.解决的办法就是将数据库操作单独放置在一个线程 ...

  5. java 异常处理发生异常_Java中的异常处理

    java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...

  6. java gc回收机制_Java中的GC回收机制

    为什么要进行GC回收? 当我们新建一个对象时,系统就会为其分配一定的内存空间,而有时候新建的对象没有去使用时,不回收的话会极大浪费内存空间,造成系统效率低下. 什么时候进行GC回收? 1.当CPU空闲 ...

  7. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  8. java中有没有栈_Java中堆和栈有什么区别

    stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...

  9. java 基本类型 引用_java中 引用类型 和 基本类型 有何区别?

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newa ...

最新文章

  1. arduino nano 蓝牙_探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架...
  2. 进程池的同步方法 pool.apply
  3. django 链接多个数据库 并使用原生sql
  4. 生物信息学搞计算机,生物信息学前景展望,谈谈感想(已经停止)
  5. Python虚拟环境virtualenv的安装与使用详解(转)
  6. 【iHMI43 4.3寸液晶模块】demo例程(版本1.02)发布
  7. 数字电路技术可能出现的简答题_2013年9月份考试数字电子技术第二次作业
  8. 面试疑点:几道题答了一个小时,应该是等答案
  9. 夏宇闻《Verilog数字系统设计教程》 - 第1章 Verilog的基本知识
  10. 读书寄语之体现人生智慧的9个字
  11. 少儿编程学习(顺序结构)
  12. MUX-VLAN隔离技术
  13. 中心极限定理 - 正态分布
  14. 江苏高考时间2021成绩查询,小高考时间2021具体时间江苏-江苏小高考成绩查询公布时间及网站...
  15. 经典算法:遗传算法(GA)
  16. appbase_实时图形数据库即服务与Appbase
  17. 微信小程序开发-多条件搜索tab展示
  18. Git 术语及中英文对照
  19. 嵌入式设备路由网络共享开发(2):移远Quectel系列4G模块驱动移值
  20. [野狐行网游研究][二期][8.21更新]

热门文章

  1. NOIP2013货车运输
  2. SpringBoot2.1.9 多Kafka消费者配置
  3. Mybatis中强大的功能元素:resultMap
  4. Oracle入门(十三B)之高级查询(上)
  5. 今天是个特殊的一天,有意义的一天,值得纪念的一天~
  6. 2018蓝桥杯省赛---java---C---9(小朋友崇拜圈)
  7. Redis安装与配置( Windows10 )
  8. 成人教育计算机统考分数查询江苏省,江苏省教育考试院查询
  9. java运行环境变量及自定义变量
  10. ReviewForJob——桶式排序+基数排序(==多次桶式排序)