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快。
翻译自: https://www.javacodegeeks.com/2013/10/stacks-and-queues-in-java.html
java 队列和堆栈
java 队列和堆栈_Java中的堆栈和队列相关推荐
- java 队列已满_JAVA中常见的阻塞队列详解
在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...
- java 递归 堆栈_Java中的堆栈安全递归
java 递归 堆栈 在本文中,摘自< Java中的函数编程 >一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险. Corecursion正在使用第一步的输出作为 ...
- java堆栈_java线程的堆栈跟踪之jstack篇
该命令打印java线程的堆栈跟踪,可以得知哪些线程被阻塞或正等待,以便于查找如线程死锁的原因 用法: jstack [ option ] pid jstack [ option ] executabl ...
- java队列怎么实现线程_Java中利用线程和队列实现入库操作
Java单线程中,如果需要大量的数据库操作,会在IO方面产生瓶颈,特别是数据库连接失败时,大量资源会消耗在数据库连接的检测上,从而使程序的实时响应速度变慢.解决的办法就是将数据库操作单独放置在一个线程 ...
- java 异常处理发生异常_Java中的异常处理
java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...
- java gc回收机制_Java中的GC回收机制
为什么要进行GC回收? 当我们新建一个对象时,系统就会为其分配一定的内存空间,而有时候新建的对象没有去使用时,不回收的话会极大浪费内存空间,造成系统效率低下. 什么时候进行GC回收? 1.当CPU空闲 ...
- java可以多重继承吗_Java中的多重继承与组合vs继承
java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...
- java中有没有栈_Java中堆和栈有什么区别
stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...
- java 基本类型 引用_java中 引用类型 和 基本类型 有何区别?
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newa ...
最新文章
- arduino nano 蓝牙_探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架...
- 进程池的同步方法 pool.apply
- django 链接多个数据库 并使用原生sql
- 生物信息学搞计算机,生物信息学前景展望,谈谈感想(已经停止)
- Python虚拟环境virtualenv的安装与使用详解(转)
- 【iHMI43 4.3寸液晶模块】demo例程(版本1.02)发布
- 数字电路技术可能出现的简答题_2013年9月份考试数字电子技术第二次作业
- 面试疑点:几道题答了一个小时,应该是等答案
- 夏宇闻《Verilog数字系统设计教程》 - 第1章 Verilog的基本知识
- 读书寄语之体现人生智慧的9个字
- 少儿编程学习(顺序结构)
- MUX-VLAN隔离技术
- 中心极限定理 - 正态分布
- 江苏高考时间2021成绩查询,小高考时间2021具体时间江苏-江苏小高考成绩查询公布时间及网站...
- 经典算法:遗传算法(GA)
- appbase_实时图形数据库即服务与Appbase
- 微信小程序开发-多条件搜索tab展示
- Git 术语及中英文对照
- 嵌入式设备路由网络共享开发(2):移远Quectel系列4G模块驱动移值
- [野狐行网游研究][二期][8.21更新]