原文作者:惊帆的BLOG

原文地址:Java中的Deque和Stack的内部原理区别

关于Deque 和 Stack,如果没有对API有很仔细的研究,单纯从使用上来说,很难仔细发现他们中间的区别,虽然他们有很大不同。而实际在Java Doc里是建议用Deque替代Stack接口完成栈的功能,我们仔细看下Java Doc里对Stack是这样描述的:

A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class. For example:Deque<Integer> stack = new ArrayDeque<Integer>();

而对Deque是这样描述的:

Deques can also be used as LIFO (Last-In-First-Out) stacks. This interface should be used in preference to the legacy Stack class. When a deque is used as a stack, elements are pushed and popped from the beginning of the deque.

也就是让我们不要再使用Stack接口去完成栈的功能,而是使用Deque,并且提供了相关例子。那么为什么会这样建议呢?首先,我们可以发现Deque是继承自Queue,而Stack是继承自Vector,这就比较奇怪了。Vector是由数组实现的集合类,他包含了大量集合处理的方法。而Stack之所以继承Vector,是为了复用Vector中的方法,来实现进栈(push)、出栈(pop)等操作。这里就是Stack设计不好的地方,既然只是为了实现栈,不用链表来单独实现,而是为了复用简单的方法而迫使它继承Vector,Stack和Vector本来是毫无关系的。这使得Stack在基于数组实现上效率受影响,另外因为继承Vector类,Stack可以复用Vector大量方法,这使得Stack在设计上不严谨,例如Vector中的:

public void add(int index, E element) {insertElementAt(element, index);
}

可以在指定位置添加元素,这与Stack 的设计理念相冲突(栈只能在栈顶添加或删除元素)。所以Java后来修正了这个不良好的设计,提出了用Deque代替Stack的建议。

Deuqe

Java中的Deuqe,即“double ended queue”的缩写,是Java中的双端队列集合类型,它集成自Deque,完全具备普通队列FIFO的功能,同时它也具备了Stack的LIFO功能,并且保留了push和pop函数,所以使用起来应该是一点障碍都没有。Deque可以由ArrayDeuqe或者LinkedList实现,它们两者使用的区别以及优劣也就是数组和链表的区别。

ArrayDeque

ArrayDeque是Deque接口的一种具体实现,是依赖于可变数组来实现的。ArrayDeque 没有容量限制,可根据需求自动进行扩容。ArrayDeque可以作为栈来使用,效率要高于 Stack。ArrayDeque也可以作为队列来使用,效率相较于基于双向链表的LinkedList也要更好一些。注意:ArrayDeque不支持为null的元素。

LinkedList

LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List 接口链表的实现。基于链表实现的方式使得 LinkedList 在插入和删除时更优于ArrayList。LinkedList实现所有可选的列表操作,并允许所有的元素包括null。除了实现List接口外,LinkedList类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。同时,与 ArrayList 一样此实现不是同步的。因此Java里面是建议使用Deque替换Stack的。

Java集合—Deque Stack相关推荐

  1. Java集合之Stack(出自Java知识体系)

    安琪拉正在梳理Java知识体系,这篇讲Java集合的Stack.如果希望获取完整的<安琪拉Java知识体系>整理中, 完成后公众号回复"知识体系" 即可获取. 完整的J ...

  2. Java 集合深入理解(13):Stack 栈

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情不错,再来一篇 Stack ! 数据结构中的 栈 数据结构中,栈是一种线性数据结构,遵从 LIFO(后进先出)的操 ...

  3. Java中用Deque接口代替Stack接口完成栈功能

    引言 之前在有需要用到栈功能的时候,都是通过使用Stack接口完成的,也就是: Stack <T> stack = new Stack <>() ​ 但今天突然发现,Java ...

  4. Java集合Stack源码深入解析

    概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...

  5. 【重难点】【Java集合 03】ArrayList、LinkedList、 Vector 和 Stack 的区别、CopyOnWriteArrayList

    [重难点][Java集合 03]ArrayList.LinkedList 和 Vector 的区别.util 包下的 List.CopyOnWriteArrayList 文章目录 [重难点][Java ...

  6. Java 集合深入理解(10):Deque 双端队列

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 什么是 Deque Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋 ...

  7. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...

    本文关键词: java集合框架  框架设计理念  容器 继承层级结构 继承图 集合框架中的抽象类  主要的实现类 实现类特性   集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...

  8. Java集合框架List,Map,Set等全面介绍

    Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构. Java集合框架的基本接口/类层次结构: java.util.Colle ...

  9. java集合框架图(一)

    一.集合类简介 Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)"丢进"该容器中.从Java 5 增加了泛型以后,Java集合可以记住容器中对象的数 ...

最新文章

  1. 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
  2. Serverless:微服务架构的终极模式(文末赠书)
  3. Oracle Stream配置详细步骤
  4. MySQL令人咋舌的隐式转换
  5. FMPlayer组件说明
  6. 牛客练习赛23: D. 托米的咒语(暴力)
  7. 【考研英语语法】一般将来时练习题
  8. 固态硬盘和机械硬盘区别 固态硬盘和机械硬盘的优缺点
  9. springmvc GET POST 接受参数方式
  10. 粗糙集理解之二:属性约简
  11. 【极致通话降噪】高通QCC3071 三麦克风通话降噪方案
  12. kettle转换中使用javascript例子整理(2)
  13. 打造心中的暗黑传奇3
  14. 带负荷测试要求二次最小电流_带负荷测向量
  15. Linux小白式安装Nginx教程
  16. Tauri 入门教程
  17. Springboot + elementUI实现上传用户头像
  18. Android代码修改SIM的PIN码,中兴U970如何修改SIM卡或UIM卡的PIN码
  19. 6个最好的WordPress图像优化器插件提高WordPress网站性能
  20. 【python】标准库(第六讲)

热门文章

  1. 不会提示是否关闭浏览器 IE6、IE7、FF通用代码
  2. 【转】主要空间数据挖掘方法
  3. 构造函数的执行序列(读书笔记)
  4. 简单的mysql热备
  5. 如何使用JDBC调用存储在数据库中的函数或存储过程 */
  6. iOS开发的一些奇巧淫技2
  7. Sql Server 邮件日志 操作
  8. C#.net技术内幕04-集合
  9. [转]linux awk命令详解
  10. python 入门第二课2 file的文件操作