为什么子孙后代会讨厌使用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冷笑话,学习之余、会心一笑:)这个思维导图将包含以下内容:…

CentOS7搭建lamp环境

Mysql安装 CentOS 7 版本将MySQL数据库软件从默认的程序列表中移除,用mariadb代替了。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后&#x…

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…

查找标题已知的窗口句柄,遍历窗口控件句柄

有了回调函数的概念及上面的例子,我们可以继续了。其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow. 其函数原形是: function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall; lpClassName:窗口类名.如果只知道标题,可以为空.窗口类名可以…

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

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

HTML第一章:初始HTML

设置ws字体大小&#xff1a;左上角file-->Settings--->在搜索框中输入font网页的第一行一定是<!DOCTYPE html>&#xff1a;网页声明&#xff0c;代表这个页面是h5页面html标签中的leng"en"&#xff1a;意思是网页中会用到英文 <meta>&#xff1a;…

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

Groovy的便利之一是能够通过Groovy的闭包支持轻松地对集合执行过滤和转换操作。 Guava将对集合的过滤和转换引入标准Java&#xff0c;这是本文的主题。 Guava的Collections2类具有两个公共方法&#xff0c;这两个方法都是静态的。 方法filter&#xff08;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;首先看一下&#xff0c;set autocommit0 后&#xff0c;执行哪些语句会自动加锁&#xff0c;加的是什么锁&#xff1f…

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

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

Spring Boot 之注解@Component @ConfigurationProperties(prefix = sms)

从spring-boot开始&#xff0c;已经支持yml文件形式的配置&#xff0c;ConfigurationProperties的大致作用就是通过它可以把properties或者yml配置直接转成对象 例如&#xff1a; 配置文件: sms.urlXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX sms.appkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXX …

Java临时缓存API –测试早期草案评审RI

它被称为“ 永无止境的故事 ”。 JSR在11年半前开始运作&#xff0c;并于2001年3月6日通过了JSR 评审投票 。 如果您想知道要获得成千上万个低JSR编号需要什么&#xff0c;那就是秘密。 与迈克尔恩德&#xff08;Michael Ende&#xff09;的德国幻想小说不同&#xff0c;这不是…

Android几秒后自动关闭dialog

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

如何获取注解中的值_如何在运行时利用注解信息

注解&#xff08; annontation &#xff09;是 Java 1.5 之后引入的一个为程序添加元数据的功能。注解本身并不是魔法&#xff0c;只是在代码里添加了描述代码自身的信息&#xff0c;至于如何理解和使用这些信息&#xff0c;则需要专门的解析代码来负责。本文首先介绍注解的基本…

mysql5.7运行按钮_MySQL 5.7.* 启动问题

mysql-5.7.10-winx64启动 mysqld.exe&#xff0c;报错&#xff1a;mysqld: Could not create or access the registry key needed for the MySQL applicationto log to the Windows EventLog. Run the application with sufficientprivileges once to create the key, add the …

控制元素的div属性

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

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

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

EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题

1.当页面加载的完成时,如果面板中的内容是未加载的如果把他的状态从隐藏变为显示会导致破版,页面信息显示不全 2.这时需要刷新面板$(#id).panel(open).panel(refresh); 3.它就会重新加载转载于:https://www.cnblogs.com/eagle-xie/p/6892706.html