为什么子孙后代会讨厌使用java.util.Stack

在我用无意义的重言式杀死你之前,这是要点

  1. 如果您的应用程序接近实时,或者将代码发送到Mars,则需要保留Java中默认的Stack实现。 根据LinkedList编写您自己的版本。
  2. 同样,如果您的应用程序是关键任务,并且希望堆栈由并发线程处理,则使用ConcurrentLinkedDeque或基于LinkedList编写自己的Stack -只需确保添加和删除操作是线程安全的即可。 这样做时,请考虑并发锁 。
  3. 您只需要原始电源,并且在push过程中不会被偶尔的打扰所困扰,并且您的Stack不会被并发线程操纵,然后使用ArrayDeque或继续基于ArrayList编写自己的Stack。
  4. 如果是多线程的,则根据ArrayQueue和util.concurrent锁编写自己的Stack
  5. 如果您拒绝阅读Java Stack API和Java Deque API,而您只是个疯子,那么请使用默认实现。 而且,我保证,当机器人占领世界时,不会显示怜悯之心。

注意:事实是,除非出于某种原因,您想要将实现类命名为' Stack ',否则您可以自由地将所有Deque实现直接用作Stack。

既然已经对默认实现抛出了足够多的麻烦,请注意几分钟,让我快速总结一下。

我们知道Java Collection API中的Stack是从Vector内部扩展的, Vector在内部使用数组。 换句话说,Java将基于数组的实现用于其Stack

因此,让我们看看为什么在两个最受欢迎的Stack实现之间-数组和链表,Java选择了数组。

有些答案很明显,有些则没有:

公平竞争

粗略地看一下数组和链表的addremove方法(它们是Stackpushpop方法的Struts),可以在整个板上进行恒定时间的检索。

增长问题

数组是固定大小的,并且仅通过将数组复制到更大的数组即​​可实现数组的增长 ,这并不是什么新闻。 在我们默认使用Vector实现Stack的情况下,增量容量仅为两倍。

这只是意味着,如果我们要向堆栈中添加80个元素,则内部数组将被复制4次–分别为10、20、40和80。因此,也就是说,当我们添加第80个元素时,push操作实际上需要O(N )时间,因为在这种情况下,我们的N为80,所以使用该残酷的深层副本将使您的程序至少稍稍停顿一下–您可以节省其他宝贵时间的宝贵小循环。

遗憾的是,与Vectors不同,您将无法指定java.util.Stack的初始大小或增量因子,因为没有重载的构造函数。

另一方面,尽管增长经常会ArrayQueue ,但ArrayQueues的初始容量有一个甜美的重载构造函数,如果您对堆栈的大小有一个大概的了解,这将派上用场。 此外,默认初始容量是16用于ArrayQueue用于作为对10 Vector

时间和地点,我的朋友。 时间和地点

为了与数组公平,存储在基于数组的堆栈中的对象只是对堆中实际对象(对于对象而言)或实际值(对于基元而言)的引用。

另一方面,在LinkedList的情况下,存储项目的顶部上方有一个Node包装器。 平均而言,每个存储的对象(包括Node对象的内部类,链接到下一个Node以及对项本身的引用)将在堆中花费约40字节的额外空间。

那么,ArrayQueue或LinkedList吗?

数组在大多数情况下都是首选的,因为它们具有占用顺序存储器的独特优势,并且它们提供了更快的访问速度,而到达实际对象只是指针运算。 但是,对阈值项目(触发调整大小的项目)的pushpop操作需要O(n)时间。 但是,平均而言,它需要花费固定时间(如果需要,可以摊销固定时间)。

另一方面,使用LinkedList ,由于要花费更多的时间来构造新节点并指向新节点,所以add操作比数组要慢。 不用说,新节点消耗的堆空间不是实际对象消耗的空间。 但是,由于没有大小调整(或需要顺序存储),并且总是引用第一个元素,因此最坏的情况是保证了恒定的时间。

现在,当您重新访问本博客的第一部分时,请随意说该死,默认实现!!!

相关链接 :

  • http://onjava.com/pub/a/onjava/2001/10/23/optimization.html
  • http://www.javaworld.com/javatips/jw-javatip130.html?page=1
  • http://docs.oracle.com/javase/7/docs/api/java/util/RandomAccess.html
  • http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Vector.java


参考资料: 为什么我们的JCG合作伙伴 Arun Manivannan会使用Rerun.me博客中的后代 人 讨厌使用java.util.Stack 。

翻译自: https://www.javacodegeeks.com/2012/11/why-future-generations-will-hate-you-for-using-java-util-stack.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

play 连接mysql_Play framework 2.x 连接mysql | 学步园

笔者所使用的系统为64位 windows7。本文假设java1.5版本以上环境已经搭好,play 框架已经下载至本地。首先我们创建一个项目。命令行进入play的目录命令:play new demo再次输入项目名字输入2 选择java项目创建完成界面OK,一个play框架下的java…

rpm -e --nodeps_微课 | rpm的思维导图

前导课程:微课 | rpm的查询、升级与卸载命令本次微课将演示使用xmind绘制rpm思维导图的过程,包括视频文字,大约需要你10分钟。另外,文末还有一则IT冷笑话,学习之余、会心一笑:)这个思维导图将包含以下内容:…

border-sizing属性详解和应用

box-sizing用于更改用于计算元素宽度和高度的默认的 CSS 盒子模型。它有content-box、border-box和inherit三种取值。inherit指的是从父元素继承box-sizing表现形式,不再冗赘。1. 属性讲解 content-box 默认值,也是css2.1中的盒子模型。在计算 width和…

Couchbase:使用Twitter和Java创建大型数据集

在播放/演示Couchbase或任何其他NoSQL引擎时,创建大型数据集的一种简单方法是将Twitter feed注入到数据库中。 对于这个小应用程序,我正在使用: Couchbase Server 2.0服务器 Couchbase Java SDK (将由Maven安装) T…

西门子scl语言编程手册_西门子SCL编程PEEK指令讲解

单词“peek”在英语中表示“偷看,瞥一眼”,在计算机编程中表示“读取数据”。在西门子SCL编程中,PEEK指令可以用来读取输入缓存区(I)、输出缓存区(Q)、位存储区(M)及数据块(DB)中的数据,常用作间接寻址。今天这篇文章,…

Guava的Collections2:过滤和转换Java集合

Groovy的便利之一是能够通过Groovy的闭包支持轻松地对集合执行过滤和转换操作。 Guava将对集合的过滤和转换引入标准Java,这是本文的主题。 Guava的Collections2类具有两个公共方法,这两个方法都是静态的。 方法filter(Collection&#xff0…

钉钉机器人怎么设置自动回复_项目部署成功后触发钉钉机器人发送消息提醒——入门配置...

钉钉建好一个群打开群设置, 找到群机器人添加一个你想要的机器人可以使用自定义自定义机器人可以自定义头像,名字,生成一个webhook(https post的请求地址)到这里, 钉钉机器人设置好了,接下来我们对照文档进行配置https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq/XAzBI -…

mysql加锁语法_MySql 加锁问题

1、设置非自动提交 set autocommit0; 这时候 for update才会起作用2、一般用法 set autocommit0; for update(加锁) ; commit/rollback; set autocommit1;首先看一下,set autocommit0 后,执行哪些语句会自动加锁,加的是什么锁&#xff1f…

td过长,将固定宽度table撑开

解决办法: 在table上加上样式: table{table-layout:fixed;word-break:break-all} table-layout:fixed tablle的列宽由表格宽度和列宽设定。 word-break:break-all 允许在单词内换行。 正常情况下: table表格中td过长: 加上样式之后&#…

Android几秒后自动关闭dialog

代码改变世界 Android几秒后自动关闭dialog AlertDialog.Builder builder new AlertDialog.Builder(v.getContext());builder.setTitle("发送成功!");builder.setMessage("2秒后自动关闭!");builder.setCancelable(true);final Ale…

控制元素的div属性

1、需求分析 改变元素的宽、高、颜色、显示、重置等属性。 2、技术分析 基础的css、html、js 3、详细分析 如图&#xff0c;单击按钮&#xff0c;改变元素属性: 3.1 HTML部分 根据视图不难发现&#xff0c;内容分两大不分:按钮栏和效果图&#xff0c;所以设置两个div。 <…

使用JMeter和Yourkit进行REST / HTTP服务的性能分析

我的上一篇文章描述了如何使用JMeter完成异步REST / HTTP服务的压力测试或负载测试。 但是&#xff0c;运行这样的测试通常表明被测系统不能很好地应对不断增加的负载。 现在的问题是如何找到瓶颈&#xff1f; 深入研究代码以检测可疑部分可能是另一种选择。 但是考虑到潜在的…

java中间件_90%的Java程序员,都扛不住这波消息中间件的面试四连炮!

概述大家平时也有用到一些消息中间件(MQ)&#xff0c;但是对其理解可能仅停留在会使用API能实现生产消息、消费消息就完事了。对MQ更加深入的问题&#xff0c;可能很多人没怎么思考过。比如&#xff0c;你跳槽面试时&#xff0c;如果面试官看到你简历上写了&#xff0c;熟练掌握…

python 取array并集_Python内置数据结构原理与性能简易分析

ins ngladc文末左下方阅读原文指向了本人博客链接&#xff0c;不含广告。参考资料中的相关链接&#xff0c;可以在博客文章的最下方获取。推荐苹果手机用户使用浅色模式观看。前言 对于一些算法题&#xff0c;可以使用Python自带的内置函数解决。但很多时候用就用了&#xff0c…

ae合成复制脚本_稀缺资源—这几个AE脚本使用频率很高,赶紧收藏吧!

「第442期」毫无疑问&#xff0c;AE已经成为目前制作短视频比较主流的软件&#xff0c;效果的多样化深受很多创作者的喜爱。随着对软件的熟悉&#xff0c;越发觉得AE主要是基于多图层控制的软件。如果制作一些简单的效果&#xff0c;几个图层几个滤镜就可以搞定&#xff0c;但如…

程序员的幸福感和颈椎病

脖子一直疼&#xff01; 去医院检查&#xff0c;拍片子的医生在造影室里冲我喊&#xff1a; “小伙子&#xff0c;你多大年纪啦&#xff1f;” 我说&#xff1a;“我三十来岁&#xff0c;咋啦” 医生说&#xff1a;“怎么这么年轻就得这种病啊&#xff01;” 我当时腿就有点软&…

python实现词语相似度计算分析_相似度计算的方法及Python实现

现实生活中&#xff0c;我们经常提到距离这个词&#xff0c;本文谈的相似度就是基于距离定义的&#xff0c;当两个向量之间的距离特别小时&#xff0c;就说这俩个向量相似度高&#xff0c;反之相似度不高。所以&#xff0c;衡量相似度的指标就是距离度量。经常使用的相似度计算…

poll函数_I/O复用 - 三组I/O复用函数的比较

在之前的文章中 I/O复用 - epoll 和 I/O复用 - select&poll 中我们讨论了三组I/O复用的系统调用&#xff0c;这3组系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间&#xff0c;直到一个或多个文件描述符上有事件发生时返回&#xff0c;返回值是…

css3画图那些事(三角形、圆形、梯形等)

闲来无事&#xff0c;写写图形。当时巩固一下css3吧.。前端小白&#xff0c;写的不好还请前辈多指教。 三角形 { width: 0;height: 0;border-bottom: 140px solid red ;border-right: 70px solid transparent;border-left: 70px solid transparent; } 圆形 {width: 0px;height…

docker 数据库 mysql_在Docker中体验数据库之MySql

在上一篇在Docker中体验数据库之Mongodb之后&#xff0c;这次记录一下在docker中安装mysql。过程要比Mongodb麻烦一点……参考网址&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/linux-installation-docker.htmlhttps://hub.docker.com/r/mysql/mysql-server/安装过程如…