Java官方文档为什么不建议用Stack实现栈的功能?

为什么说JDK中的Stack设计是失败的 Java中的Stack是通过Vector来实现的,这种设计被认为是不良的设计,说说你的看法? 几乎所有语言在实现栈时,都会实现这两个方法,进栈和出栈。而栈这种数据结构在多数时候用来插入和删除元素(进栈则是在顶部插入元素,出栈则是从顶部删除元素),较少情况会用来查找元素。所以从实现方式上,大多是以链表方式实现而非数值方式实现(在插入删除方法上,链表效率优于数组效率)。 反观Java中的Stack,查看源代码: public class Stack<E> extends Vector<E& 阅读详情

JDK的官方文档不建议使用Stack实现栈的功能,转而使用Deque接口的ArrayDeque实现栈的功能。

当初 JDK1.0 在开发时,可能为了快速的推出一些基本的数据结构操作,所以推出了一些比较粗糙的类。比如,Vector、Stack、Hashtable等。这些类中的一些方法加上了 synchronized 关键字,容易给一些初级程序员在使用上造成一些误解!而且在之前的几个版本中,性能还不怎么好。

基于 Vector 实现的栈 Stack。底层实际上还是数组,所以还是存在需要扩容。Vector 是由数组实现的集合类,它包含了大量集合处理的方法。而 Stack 之所以继承 Vector,是为了复用 Vector 中的方法,来实现进栈(push)、出栈(pop)等操作。这里就是 Stack 设计不好的地方,既然只是为了实现栈,不用链表来单独实现,而是为了复用简单的方法而迫使它继承 Vector,Stack 和 Vector 本来是毫无关系的。这使得 Stack 在基于数组实现上效率受影响,另外因为继承 Vector 类,Stack 可以复用 Vector 大量方法,这使得 Stack 在设计上不严谨。

Java 提供了 Deuqe。Deque 是继承自 Queue,而 Stack 是继承自 Vector。Java 中的 Deuqe,即“double ended queue”的缩写,是 Java 中的双端队列集合类型。Deque 具备普通队列 FIFO 的功能,同时它也具备了 Stack 的 LIFO 功能,并且保留了 push 和 pop 函数,所以使用起来应该是一点障碍都没有。

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

接口方法对照:
在这里插入图片描述
在这里插入图片描述

参考链接:
https://www.cnblogs.com/cosmos-wong/p/11845934.html
https://www.jianshu.com/p/64fc76ca66c9

为什么Java中用Deque实现栈而非Stack? System.out.println("性能提升: " + (stackTime - dequeTime) * 100 / stackTime + "%");System.out.println("Stack操作时间: " + stackTime / 1_000_000 + " ms");System.out.println(name + " 耗时: " + duration / 1_000_000 + " ms");System.out.println("栈大小: " + stack.size()); 阅读详情

相关推荐

java 栈的实现和应用

用java写的简单栈的实现,欢迎大家使用

Java Coder为什么不建议使用Stack类来实现栈功能

最近在做Leetcode算法题的时候,发现了一个有趣的问题。当需要用到栈这种数据结构时,在java题解中,有的人使用的Stack类来实现,有的人使用LinkedList来实现,还有的人使用Queue或者Deque来实现。 对于我这个菜鸡来说,小小的脑袋大大的问号,为了查清楚到底哪种写法是规范化的写法,本菜鸡在查看了很多技术文章后,终于理清了思路。 下面直接贴一下我觉得总结的很全面的一篇微信公众号文章,希望能帮助到有同样问题的小伙伴。 以下是原文 在 Leetcode 的交流区,可以看到这样的一个讨.

qq_39144436的博客 1494

机械臂的运动学分析-工业机器人

机械臂的运动学是研究机械臂各连杆坐标系之间的运动关系,是对机械臂进行运动控制的基础。本章分析了所设计的六自由度机械臂的运动学。理论上六自由度机械臂的工作空间是一个近似球形区域,能够覆盖机械臂所在的位置,但由于机械臂关节的运动范围受到限制,机械臂末端会存在一些不能到达的工作死区,使得机械臂的工作范围和灵活性受到限制。理论上六自由度机械臂的工作空间是一个近似球形区域,能够覆盖机械臂所在的位置,但由于机械臂关节的运动范围受到限制,机械臂末端会存在一些不能到达的工作死区,使得机械臂的工作范围和灵活性受到限制。

qq_59137727的博客 6648

[算法]LeetCode每日一题--739每日温度(Java)

DailyChallenge 739. 每日温度 20200611 难度:中等 题目描述1 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在

shinezzz的博客 885

别再死记硬背了!用TwinCAT 3手把手教你配置EtherCAT伺服驱动的PDO映射(DS402协议)

本文详细介绍了如何使用TwinCAT 3配置EtherCAT伺服驱动的PDO映射(DS402协议),涵盖环境准备、设备扫描、PDO映射实战及高级技巧。通过具体操作步骤和常见问题排查,帮助工程师快速掌握EtherCAT通信配置,提升运动控制系统的效率和稳定性。

weixin_29185493的博客 323

STM32 SYSTICK定时器及延时函数详解

STM32 SYSTICK及延时函数详解 SysTick定时器 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心

w1050321758的博客 2368

为什么Java中别用Stack类来实现栈

Java官方已经在Stack类中注明了不推荐使用Stack类来实现栈。 但为什么不推荐使用Stack这个类呢?这个类最大的问题源于继承了 Vector 类,因此Stack类也继承了Vector类的所有公有方法。而Vector类是有能力在数组中的任何位置添加或者删除元素的,因此Stack 也有这个能力。但很明显,栈不应该具有在任何位置添加或者删除元素的能力,封装的一大意义,就是向用户屏蔽用户不需要的操作。否则,用户可能会有意无意地调用这些操作,造成很多不必要的BUG。 ...

qq_43708373的博客 1363

游戏市场销售数据抓取:使用Python爬虫获取游戏市场上的销售情况和玩家反馈

在本文中,我们使用Python爬虫抓取了多个游戏平台上的销售数据、玩家反馈和游戏动态。通过使用requests和Selenium,我们能够有效地获取静态和动态网页数据,并利用pandas进行数据处理和存储。如果您有更具体的需求,可以扩展此爬虫以抓取更多的数据,进行深度分析或实现更复杂的可视化功能。数据抓取是一项非常强大的技术,它不仅能够帮助游戏开发者优化产品,还能帮助营销团队理解玩家需求,提升市场竞争力。

2201_76125261的博客 1308

Java 为什么不推荐使用 Stack

因为 Stack 是 JDK 1.0 的产物。它继承自 Vector,Vector 都不被推荐使用了,你说 Stack 还会被推荐吗? 当初 JDK1.0 在开发时,可能为了快速的推出一些基本的数据结构操作,所以推出了一些比较粗糙的类。比如,Vector、Stack、Hashtable等。这些类中的一些方法加上了 synchronized 关键字,容易给一些初级程序员在使用上造成一些误解!而且在之前的几个版本中,性能还不怎么好。 基于 Vector 实现的栈 Stack。底层实际上还是数组,所以还是存在需要

fall_hat的博客 2866

完整功能-《网络安全创新实践》:设计并实现一种基于Npcap的网络嗅探器(直接能运行cpp的MFC代码+实验报告)

《网络安全创新实践》:设计并实现一种基于Npcap的网络嗅探器。(直接能跑的MFC)监听所有数据包,以及监听指定IP地址的数据包;(2)能够显示完整的IP数据包首部信息,例如:版本、首部长度、数据包长度、数据包类型(协议字段)、TTL、源IP地址、目的IP地址等;(3)能够显示完整的TCP报文段信息,例如:源端口、目的端口、序号、确认号、数据部分等;(4)能够自动检测SQL注入攻击等Web攻击行为;(5)能够将监听到的数据包信息保存到文件中,以及从文件中读取并显示数据包信息;(6)具有图形化操作界面。

weixin_46531010的博客 661

CUDA内核反汇编实战:用cuobjdump解锁SASS指令的奥秘

本文详细介绍了CUDA内核与SASS指令的关系,以及使用cuobjdump工具进行反汇编分析的方法。主要内容包括:1. CUDA内核的基本概念及其在GPU并行计算中的重要性;2. SASS指令作为底层汇编指令的关键作用;3. cuobjdump工具的安装配置和使用方法;4. 通过数组加法实例演示反汇编过程;5. 深入分析SASS指令格式、分类和执行流程;6. 两个实际案例展示性能优化和问题排查的应用。文章为开发者提供了深入理解CUDA程序底层执行机制的有效途径。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 439

JAVA 栈,为什么要使用Deque,而不推荐使用Stack,Deque中ArrayDeque与LinkedList的区别,Deque方法详解

ArrayDeque , LinkedList , Stack的关系差不多就是下图那样 Stack实现了Vector接口,LinkKist实现了Deque,List接口,ArrayDeque实现了Deque接口 那为什么不推荐使用Stack? 因为Vector是当初JAVA曾经写得不太行的类,所以Stack也不太行。 Vector不行是因为效率不太行,很多方法都用了synchronized修饰,虽然线程安全,但是像ArrayDeque,LinkedList这些线程不安全的,在需要安全的时候也可以用Coll

LittleWear的博客 1万+

操作系统实验一到实验九合集(哈工大李治军)

操作系统实验一到实验九合集(哈工大李治军) 有详细代码及注释,程序已在本地测试,均能跑通

leoabcd12的博客 5万+

Java 为什么推荐用Deque实现Stack

Java推荐使用 Deque stack = new ArrayDeque() 代理Stack类实现栈结构的原因

知其所以然 1767

利用dpabi和restplus提取ROI灰质体积学习笔记

目录前言一、数据准备二、利用dpabi提取ROI灰质体积三、restplus提取ROI灰质体积 前言 我利用SPM/CAT12进行灰质、白质、脑脊液分割之后分别已经得到各自的图像文件,在全脑水平已经做了统计分析。如果还想要进一步进行ROI的统计分析或者与量表等临床资料做相关分析,就需要提取ROI灰质体积。几个月没动过这数据了,突然心血来潮想学一下如何提取ROI灰质体积,以此篇博客记录我的提取ROI灰质体积学习过程。提取ROI灰质体积的方法及软件有许多种,本人尝试了dpabi和restplus。 一、数据准备

weixin_52073820的博客 9225

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java中栈(Stack)用法

java 栈 stack

Sueko的博客 3万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java为什么使用Deque实现Stack

在 Leetcode 的交流区,可以看到这样的一个讨论: 翻译: 我不明白,为什么现在已经 2018 年了(这是 2018 年的帖子),Java 11 马上就要推出了,为什么还有人使用 Java 中的 Stack 类? 作为硅谷大厂的一名面试官,我见过太多的面试候选人使用 Stack 类。从面试的角度,这非常不好(这篇帖子的后续讨论,甚至有人提到,这可能使你丢掉一个 offer)。 当被问到为什么使用 Stack 类时,什么是已经弃用的方式的时候,大多数人只是回答:网上的解答是

Coder 1758

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

为什么不推荐使用Stack

Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。

chengxuyuanlaow的博客 1043

JAVA 中栈,为什么要使用Deque,而不推荐使用Stack

一、概念1. 概念双端队列(Deque)是Quene是一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队(push)和出队(pop),则可限制栈的数据结构。对于栈而言,有入栈,遵循先进后出原则。2. 双端队列的使用(在实际使用中,Deque接口使用的是比较多的,栈和队列都可以使用该接口,这个接口中有栈的方法,也有队列的方法)Quene以及Deque都是继承于Collection,Deque是Quene的子接口。

qq_40222433的博客 1928

为什么Java已经不推荐使用Stack了?

Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。

weixin_62421895的博客 1086

Java中栈(Stack)

栈像一个客栈一般,为数据提供歇脚的地方,从概念,方法理解栈,模拟实现栈 或许你会有一天怀念,可是我已不再—    小镇姑娘 DT

LL_break的博客 2805

java为什么不推荐使用stack_栈和队列的面试题Java实现,Stack类继承于Vector这两个类都不推荐使用...

在 thinking in java中看到过说Stack类继承于Vector,而这两个类都不推荐使用了,但是在做一到OJ题时,我用LinkedList来模拟栈和直接用Stack,发现在进行入栈出栈操作时Stack的速度竟然还快一点然而需要多线程的时候有Collections.synchronizedList,还有java.util.concurrent包下的。所以还是忘了这货吧。Java 中还有非...

weixin_35160923的博客 744

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

Java中用Deque接口代替Stack接口完成栈功能 引言 之前在有需要用到栈功能的时候,都是通过使用Stack接口完成的,也就是: Stack <T> stack = new Stack <>() ​ 但今天突然发现,Java Doc里建议用Deque替代Stack接口完成栈的功能,于是我稍微研究了一下。 Java文档 在JavaDoc for Stack中这样说: Deque接口及其实现提供了一组更完整和一致的LIFO堆栈操作,应优先使用此类。例如:Deque<

ConnorTomato的博客 1174

Java Stack 栈 常用方法

文章目录Stack 栈简介常用方法用法讲解 Stack 栈 简介 stack 类是 Vector 类的一个子类,它实现了标准的后进先出的栈 常用方法 序号 方法 作用 1 boolean empty() 判断栈是否为空 2 Object peek() 查看栈顶部的对象,但不从堆栈中移除它 3 Object pop() 移除栈顶部的对象,并作为此函数的值返回该对象。 4 Object push(Object obj) 把元素压入栈顶部 5 int search(Object

Late_whale的博客 作者:代码搬运工老李的二师兄 2398
上一篇: 删除表内数据使id重新从1增长(truncate和delete)
下一篇: 数据库建表的一些约束与规则
Liar_27
博客等级 码龄9年 8粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值