当前位置: 首页 > article >正文

【Java】从源码深入理解 Stack

从源码深入理解 StackStack的整体架构Stack的成员变量Stack的构造函数Stack的常用方法源码解读压栈push()出栈pop()获取栈顶元素peek()判断是否为空empty()查找元素search()存储的元素个数size()Stack的设计缺陷破坏封装性线程安全的代价Stack vs Deque常见面试题Q1Stack的底层数据结构是什么Q2Stack是线程安全的吗Q3为什么官方不推荐使用Stack?Q4Stack和ArrayDeque的区别Q5Stack的search方法返回值为什么从1开始Stack的整体架构Stack类的继承关系如下publicclassStackEextendsVectorE从继承结构可以看出VectorStack继承自Vector这意味着Stack拥有Vector的所有方法由于继承VectorStack本质上是一个数组实现的栈Stack的成员变量Stack类本身没有定义任何成员变量所有数据存储都来自父类Vector// Vector类中的核心成员变量protectedObject[]elementData;// 存储元素的数组protectedintelementCount;// 实际元素个数protectedintcapacityIncrement;// 容量增长系数Stack的构造函数// Stack只有一个无参构造器publicStack(){}注意Stack没有指定初始容量的构造器完全依赖Vector的默认行为。// Vector的无参构造器publicVector(){this(10);// 默认初始容量为10}Stack的常用方法源码解读压栈push()publicEpush(Eitem){addElement(item);// 调用父类Vector的方法returnitem;}查看Vector的addElement方法publicsynchronizedvoidaddElement(Eobj){modCount;// 记录修改次数用于迭代器快速失败ensureCapacityHelper(elementCount1);// 确保容量足够elementData[elementCount]obj;// 在数组末尾添加元素}addElement是synchronized的所以Stack是线程安全的栈顶对应数组的末尾最后一个元素当容量不足时会触发动态扩容容量扩容逻辑privatevoidensureCapacityHelper(intminCapacity){if(minCapacity-elementData.length0)grow(minCapacity);// 需要扩容}privatevoidgrow(intminCapacity){intoldCapacityelementData.length;// 如果capacityIncrement 0则增加capacityIncrement// 否则容量翻倍这是Vector与ArrayList的主要区别intnewCapacityoldCapacity((capacityIncrement0)?capacityIncrement:oldCapacity);if(newCapacity-minCapacity0)newCapacityminCapacity;if(newCapacity-MAX_ARRAY_SIZE0)newCapacityhugeCapacity(minCapacity);elementDataArrays.copyOf(elementData,newCapacity);}出栈pop()publicsynchronizedEpop(){Eobj;intlensize();// size()返回elementCountobjpeek();// 先获取栈顶元素removeElementAt(len-1);// 删除最后一个元素returnobj;}获取栈顶元素peek()查看peek()方法publicsynchronizedEpeek(){intlensize();if(len0)thrownewEmptyStackException();// 栈空抛异常returnelementAt(len-1);// 返回数组最后一个元素}查看removeElementAt方法publicsynchronizedvoidremoveElementAt(intindex){modCount;if(indexelementCount){thrownewArrayIndexOutOfBoundsException(index elementCount);}elseif(index0){thrownewArrayIndexOutOfBoundsException(index);}intjelementCount-index-1;if(j0){// 将index后面的元素向前移动对于栈来说j0不会执行System.arraycopy(elementData,index1,elementData,index,j);}elementCount--;elementData[elementCount]null;// 帮助GC}关键点对于栈来说removeElementAt总是删除最后一个元素所以System.arraycopy不会执行j0性能为O(1)。判断是否为空empty()publicbooleanempty(){returnsize()0;}查找元素search()publicsynchronizedintsearch(Objecto){intilastIndexOf(o);// 从后往前找if(i0){returnsize()-i;// 转换为从1开始的位置}return-1;}查看Vector的lastIndexOf方法publicsynchronizedintlastIndexOf(Objecto){returnlastIndexOf(o,elementCount-1);}publicsynchronizedintlastIndexOf(Objecto,intindex){if(indexelementCount)thrownewIndexOutOfBoundsException(index elementCount);if(onull){for(intiindex;i0;i--)if(elementData[i]null)returni;}else{for(intiindex;i0;i--)if(o.equals(elementData[i]))returni;}return-1;}search是从栈顶数组末尾向栈底数组开头搜索返回的位置从1开始栈顶位置为1而不是从0开始找不到返回-1存储的元素个数size()// Stack类本身没有定义size()方法继承自Vectorpublicsynchronizedintsize(){returnelementCount;}Stack的设计缺陷破坏封装性由于Stack继承Vector它拥有了Vector的所有公开方法StackIntegerstacknewStack();stack.push(1);stack.push(2);stack.push(3);// 这些操作破坏了栈的LIFO特性stack.add(0,100);// 在底部插入stack.get(1);// 随机访问stack.remove(0);// 删除中间元素stack.set(1,999);// 修改非栈顶元素问题栈本应只提供push/pop/peek操作但继承导致暴露了所有List操作栈的语义被破坏。线程安全的代价Stack的所有方法都是synchronized的但在大多数单线程场景下这个同步是不必要的开销。Stack vs Deque从Java 1.6开始官方推荐使用Deque接口的实现类如ArrayDeque作为栈的替代// 推荐做法DequeIntegerstacknewArrayDeque();// 栈操作对应关系// Stack.push() → Deque.push() / addFirst()// Stack.pop() → Deque.pop() / removeFirst()// Stack.peek() → Deque.peek() / peekFirst()// Stack.empty() → Deque.isEmpty()// Stack.search() → 无直接对应需要自己实现特性StackArrayDeque底层实现数组Vector循环数组线程安全是synchronized否阻塞操作不支持不支持容量限制无动态扩容无动态扩容额外List操作有破坏封装无内存效率较低Vector有capacityIncrement较高2的幂次扩容性能较慢同步开销较快推荐程度❌ 不推荐✅ 推荐// 使用 Stack不推荐StackIntegerstack1newStack();stack1.push(1);stack1.push(2);Integertop1stack1.pop();// 使用 ArrayDeque推荐DequeIntegerstack2newArrayDeque();stack2.push(1);// 等价于 addFirst()stack2.push(2);Integertop2stack2.pop();// 等价于 removeFirst()// 也可以使用 LinkedList但性能不如ArrayDequeDequeIntegerstack3newLinkedList();常见面试题Q1Stack的底层数据结构是什么A数组继承自Vector。Q2Stack是线程安全的吗A是所有核心方法都是synchronized的。Q3为什么官方不推荐使用Stack?A1继承Vector破坏了封装性暴露了不该有的List操作2同步开销在不必要场景下影响性能3推荐使用ArrayDeque替代。Q4Stack和ArrayDeque的区别AStack继承Vector数组实现线程安全但性能较差ArrayDeque使用循环数组非线程安全但性能更好且只暴露栈操作。Q5Stack的search方法返回值为什么从1开始A为了符合栈的语义——栈顶距离为1栈底距离为栈深度。这样设计使得位置与距离概念统一。

相关文章:

【Java】从源码深入理解 Stack

从源码深入理解 StackStack的整体架构Stack的成员变量Stack的构造函数Stack的常用方法:源码解读压栈:push()出栈:pop()获取栈顶元素:peek()判断是否为空:empty()查找元素:search()存储的元素个数&#xff1…...

ExplorerPatcher使用指南:3步恢复Windows经典界面体验

ExplorerPatcher使用指南:3步恢复Windows经典界面体验 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher ExplorerPatcher是一款强大的…...

Comsol水力压裂:渗流 - 应力 - 损伤耦合模型探索

Comsol水力压裂 渗流-应力-损伤耦合模型 本模型采用Comsol软件模拟注水过程中的岩石损伤和孔隙水压发展,采用经典摩尔库伦准则和抗拉阶段准则计算损伤 无需借MATLAB计算损伤变量在Comsol里面采用内置模块计算损伤变量,计算效率高 岩石采用Weibull分布描述…...

小产能起步第一台设备怎么选?5-100MW半自动产线入门,曜华激光为你指路

对于刚踏入光伏组件制造领域的中小厂商而言,从一条小产能半自动产线起步,是务实而理性的选择。然而,面对从电池片到组件的十几道工序,第一台设备该选什么?本文从入门角度,梳理设备选型的优先级与判断标准。…...

COMSOL电磁超声仿真技术:基于5.6版本模型,精确检测L形铝板裂纹的电磁超声测量方法

COMSOL电磁超声仿真: Crack detection in L-shaped aluminum plate via electromagnetic ultrasonic measurements 版本为5.6,低于5.6的版本打不开此模型电磁超声检测(EMAT)在工业无损检测领域一直是个热门方向,最近在COMSOL 5.6上…...

纸箱压缩试验机哪个好

在包装行业,纸箱抗压性能直接决定着产品运输安全、仓储效率和企业成本控制。而纸箱压缩试验机(抗压试验机)就是衡量纸箱是否“扛得住”的核心设备。面对市面上琳琅满目的品牌与型号,很多企业主都会问:纸箱压缩试验机哪…...

【无标题】一次简笔

我是一名大一的学生,我未来想要从事计算机方面的工作。我充满理想有自信,相信我可以找到一份3w的工作,我想要到腾讯当技术岗位,我愿意花费精力和时间在这方面学习编程。我会每周拿出六天时间来潜心学习。“what doesnt kill me ma…...

【深伪检测】论文整体调研与梳理方法

一、单篇论文精读:抓核心信息(先“拆”后“懂”) 每篇论文都要完成「标题→摘要→引言→方法→实验→相关工作」的递进式阅读,目的是精准捕捉“这篇论文在解决什么问题、用了什么方法、做出了什么贡献”。标题摘要(10分…...

【枕上节令笺】清明食青团,一口咬尽江南春

最近下班有时间,都在捣鼓公众号文章,之前的两天一直沉迷于改主题、改完主题改内容排版、最后发现文章偏离主题写的太杂了,奈何语文水平太久没用了,就想到用写技术博客的总分总的写法去表诉文章…有热爱或想写公众号的同学一起交流…...

读取Excel数据(替换your_data.xlsx即可)

多输入vmd-pso-lstm多维时序预测模型(多输入单输出) ,价格仅为程序价格,不包含原理讲解 数据均为Excel数据替换数据就可以运行所有程序都经过验证,保证程序可以运行,具有良好的编程习惯,程序均包…...

用户智能体交互协议AG-UI(上)

三大Agent协议对比 我们之前已经学习了MCP 和 A2A两个重要的协议了,加上AG-UI,它们共同组成了Agent的三大通信协议体系。 不过,它们的定位各有侧重,并非非此即彼,而是协同使用,用形象的比喻来讲&#xff…...

2026跨境电商数据采集避坑指南:实测实在Agent如何终结“数字员工”的幻觉时代

【摘要】 2026年3月,跨境电商行业正式迈入“Agent驱动”的生产力新纪元。随着阿里巴巴Accio Work、腾讯云MAGIC Agent 2.0等工具的密集发布,传统基于脚本的爬虫正被具备自主决策能力的“数字员工”取代。然而,在实际业务落地中,通…...

免死金牌: OpenClaw + keepalived

文章目录背景解决方案查看IP检测脚本keepalived 配置演练故障openclaw-gateway.service背景 问题来自 小龙虾自杀, 当我让 OpenClaw 更新一些配置时, 它执行了一条 openclaw gateway stop 命令, 导致 OpenClaw 服务停止, 然后我就干瞪眼了, 还在傻等, 它甚至一句分别的话都没有…...

KiloClaw:为企业AI代理安全合规保驾护航

OpenClaw托管版KiloClaw:企业AI代理管理新方案由GitLab联合创始人Sid Sijbrandij和Scott Breitenother共同创立的Kilo,推出了面向企业的KiloClaw,它是OpenClaw平台的托管版本。该产品旨在为企业提供对员工使用AI代理执行代码库监控、邮件起草…...

告别API依赖!实测具备“看屏幕”能力的Agent,实在Agent如何重构企业自动化天花板?

在2026年这个被业界公认为“智能体元年”的当下,企业数字化转型已从简单的“系统上线”演进到“全量自动化”的深水区。然而,传统API接口的局限性与老旧系统的数据孤岛,始终是横亘在降本增效路上的大山。本文由「企服AI产品测评局」带来深度实…...

航美实木板:以匠心守健康,用实力赢信赖——一位经销商的真情告白

“一张好的板材,守护的不是一个人,而是一个家庭的健康与幸福。”说这句话的汪总,是实木行业的“老炮儿”,深耕实木定制多年的他,对木材“热胀冷缩必变形开裂”的特性深信不疑。直到刷到航美实木板的宣传视频&#xff0…...

An-Labeler:AudioLabellerV3 AI 辅助标注工具详解(自研Qt + FFT/模型自动标注)

An-Labeler V3:AudioLabeller AI 辅助标注工具详解(自研Qt + FFT/模型自动标注) Author: Code-keys (qq_37445230) Version: V3 (2026-03) 系列文章: An-Labeler:AudioLabeller 高效音视频标注工具 [AAn-Labeler:AudioLabellerV3 AI 辅助标注工具详解] 一、V3 版本更新概…...

多车环境下车载毫米波雷达是否会相互干扰?

在汽车工业迈向智能化与自动化的进程中,毫米波雷达已然成为了车辆感知体系中不可或缺的一部分。这种波长介于1毫米至10毫米之间的电磁波进行探测的装置,凭借其能够穿透雨雪、浓雾及强光直射的全天候工作能力,为高级驾驶辅助系统提供了关键的距…...

2.4.快速排序——先分区再递归,为什么它平均这么快却可能退化?

2.4.快速排序——先分区再递归,为什么它平均这么快却可能退化? 系列:搜索与排序 | 第 4 篇,共 16 篇 难度:⭐⭐⭐☆☆ 中等 标签:排序 快速排序 分治 随机化 三路快排 上一篇:2.3.插入排序——像…...

自注意力:句子里的词互相“看“对方——信息交流的艺术

自注意力:句子里的词互相"看"对方——信息交流的艺术(Version B) 📚 《从零到一造大脑:AI架构入门之旅》专栏 专栏定位:面向中学生、大学生和 AI 初学者的科普专栏,用大白话和生活化比喻带你从零理解人工智能 本系列共 42 篇,分为八大模块: 📖 模块一【A…...

注意力机制:AI 也会“走神“和“专注“——信息选择的智慧

注意力机制:AI 也会"走神"和"专注"——信息选择的智慧(Version B) 📚 《从零到一造大脑:AI架构入门之旅》专栏 专栏定位:面向中学生、大学生和 AI 初学者的科普专栏,用大白话和生活化比喻带你从零理解人工智能 本系列共 42 篇,分为八大模块: 📖…...

【ABAP】客转供 客户转供应商 cl_md_bp_maintain=>maintain 创建供应商

报错:未分配客户/供应商,您无法传输客户/供应商数据 这是因为如果创建的时候是作为客户的, 后面想要创建为供应商,所以调用的供应商创建/修改接口。 但是这时候,LFA1里面是没有供应商编号的,只有BUT000里面…...

破解厂区防控难题:远程控制联网报警器的技术优势与应用实践

一、厂区安全防控的时代挑战与技术革新在工业生产规模化、厂区安全管理标准化的发展趋势下,厂区安全防控已成为企业生产运营的核心工作。我国正处于厂区安防从 "人工巡检为主" 向 "技防联动" 转型的关键阶段,据行业数据显示&#xf…...

终极指南:如何免费解锁Cursor Pro功能,彻底解决API限制问题

终极指南:如何免费解锁Cursor Pro功能,彻底解决API限制问题 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve …...

30美元实现AI视觉革命:OpenGlass开源智能眼镜的平民化方案

30美元实现AI视觉革命:OpenGlass开源智能眼镜的平民化方案 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass 当商业智能眼镜以数千元价格将普通用户拒之门外时&…...

本科论文AI率高不高影响答辩?这个问题要搞清楚

很多同学AI率超标之后第一个问题就是:这会不会影响我参加答辩? 这个问题的答案取决于你的学校是怎么规定的,也和你超标的程度有关。我来帮你分析清楚。 各高校对AI率的处理方式 目前各高校的处理方式大致分三类: 第一类&#…...

2026年Magento独立站中国商家收单支付平台综合评估

2026年,全球收单市场持续分化。监管门槛抬升使支付牌照成为稀缺资源,资金周转效率从“加分项”变为“必选项”。对于使用Magento搭建独立站的中国商家,收单平台的选择已从单一的费率比较,升级为对合规深度、资金效率、本地化能力的…...

C++ 动态内存管理深度解析:new/delete 完全指南

引言在 C 语言中,我们使用 malloc()、calloc()、realloc() 和 free() 来管理动态内存。而 C 引入了全新的动态内存管理方式——new 和 delete。这不仅带来了语法上的简化,更重要的是引入了类型安全和初始化的概念。在学习过程中,我对 new 的理…...

文书妙笔专为公文写作打造,让写材料效率翻倍

不同于市面上通用型写作工具,文书妙笔每一项功能都为公文写作量身定制,真正实现“写材料效率翻倍”。作为专为公文写作打造的平台,平台内置40W优质公文范文库,每日持续更新,更整合了最新政策表述、基层工作案例和规范金…...

Oracle数据库进程体系结构概述

Oracle数据库进程体系结构概述 Oracle属于多进程体系架构,它由多个后台进程组成,每个后台进程完成特定的维护任务,进程之间互相协助,最终共同完成数据库所需的维护任务。 本文讲述的内容: 1、进程类型 2、Oracle两种服…...