java stack deque_java如何实现栈

java stack deque_java如何实现栈Java中的栈Stack、Deque、ArrayDeque、LinkedList的区别Stack类那么为什么我们不选择Stack呐?(两个主要原因)那么我们应该使用ArrayDeque还是LinkedList呐?总结Stack类Java中Stack类底层是数组实现的线程安全的栈。先进后出,常用操作是push/pop/peek而Deque是更加适用的双端队列接口,其通过ArrayDeque/LinkedList初始化实现Deque<Integer>stack=newArrayDeq

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Stack类

Java中Stack类底层是数组实现的线程安全的栈。先进后出,常用操作是push/pop/peek

而Deque是更加适用的双端队列接口,其通过ArrayDeque/LinkedList初始化实现

Deque<Integer> stack = new ArrayDeque<>();
Deque<Integer> stack = new LinkedList<>();

那么为什么我们不选择Stack呐?(两个主要原因)

1.从性能上来说应该使用Deque代替Stack。

Stack和Vector都是线程安全的,其实多数情况下并不需要做到线程安全,因此没有必要使用Stack。毕竟保证线程安全需要上锁,有额外的系统开销。

2、Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。

Stack从Vector继承的一个副作用是,暴露了set/get方法,可以进行随机位置的访问,这与Stack只能从尾巴上进行增减的本意相悖。

此外,Deque在转成ArrayList或者stream的时候保持了“后进先出”的语义,而Stack因为是从Vector继承,没有这个语义。

Stack<Integer> stack = new Stack<>();
Deque<Integer> deque = new ArrayDeque<>();

stack.push(1);
stack.push(2);
deque.push(1);
deque.push(2);

System.out.println(new ArrayList<>(stack)); // [1,2]
List<Integer> list1 = stack.stream().collect(Collectors.toList());//[1,2]

// deque转成ArrayList或stream时保留了“后进先出”的语义
System.out.println(new ArrayList<>(deque)); // [2,1]
List<Integer> list2 = deque.stream().collect(Collectors.toList());//[2,1]

那么我们应该使用ArrayDeque还是LinkedList呐?

ArrayDeque和LinkedList这两者底层,一个采用数组存储,一个采用链表存储;

数组存储,容量不够时需要扩容和数组拷贝,通常容量不会填满,会有空间浪费;

链表存储,每次push都需要new Node节点,并且node节点里面有prev和next成员,也会有额外的空间占用。

总结

ArrayDeque会略胜一筹,不过差别通常可以忽略
经过性能对比,更倾向于使用ArrayDeque来表达Java中的栈功能

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191507.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • react js清除浏览器缓存

    react js清除浏览器缓存最近遇到这样一个问题,项目在谷歌上完全正常,但是到了ie浏览器,发现点击保存之后界面没有刷新,打开F12,接口调用成功,下发参数正确,查询返回的结果还是原来那个。定位之后,发现查询走的是浏览器缓存…F12已接收那显示(来自缓存),时间0秒。下面就是清缓存的方法:加上这句Pragma:’no-cache’,headers:{Pragma:’no-cache’,//解决IE11走缓存无法刷新问题Aut…

    2022年7月18日
    18
  • 苹果新旧手机数据转移_换机必备知识:如何将数据转移到Oppo手机上

    苹果新旧手机数据转移_换机必备知识:如何将数据转移到Oppo手机上现在的智能手机越来越便宜了,换手机是经常的事情。但唯一的缺点是更换手机时新旧手机的数据备份很麻烦。许多人会选择将数据传输到计算机,然后再传输到新手机。或者,用户将可以备份的内容备份到microSD卡上。但这些方法都比较老土。如今,智能手机制造商拥有专用的应用程序,可以使此过程变得轻松,高效和无缝。本指南将教您如何将所有个人数据(SMS,电话,应用程序,照片等)从旧手机转移到Oppo品牌的手机上。…

    2022年5月25日
    226
  • 记录:Navicat导入mysql数据库失败[Err]1046 – No database selected…【解决方案】

    记录:Navicat导入mysql数据库失败[Err]1046 – No database selected…【解决方案】[Err]1046-Nodatabaseselected导入失败bug,请看我怎么做的

    2022年10月14日
    0
  • java uniqueresult_「uniqueresult」hibernate uniqueResult方法 – seo实验室[通俗易懂]

    java uniqueresult_「uniqueresult」hibernate uniqueResult方法 – seo实验室[通俗易懂]uniqueresult数据库中根据你的查询条件只会返回唯一结果,就可以用uniqueresult这个方法!否则就用list();其返回类型为ObjectuniqueResult()方法通常是在业务方法查询语句中用到的,比如(Usersroles)getsession().createQuery(“selecturfromUsersRolesurwhereur.role.id=?…

    2022年9月11日
    0
  • pycharm2021.11.3永久激活_最新在线免费激活

    (pycharm2021.11.3永久激活)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    55
  • 空间统计:Moran’s I(莫兰指数)

    空间统计:Moran’s I(莫兰指数)前两天聊了空间统计学里面的两个经典概念,今天来说说第一篇文章留下的大坑:Moran’sI。首先,Moran’sI这个东西,官方叫做:莫兰指数,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(PatrickAlfredPierceMoran)(好长的名字,不过一般都简称为:帕克·莫兰,就是下图这位中年帅哥了),在1950年提出的。这一年,朝鲜战争爆发。莫兰同学1917…

    2022年6月25日
    83

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号