这篇文章开始介绍Stack。从名字看他就是一个stack,因此具有数据结构中栈的一般特性(后进先出),平时用起来相对较多一点,但是也是非常简单。这篇文章我们将从源码的角度来分析一下Stack。

OK,开始今天的文章。

一、认识Stack

Stack继承自Vector。底层是通过数组实现的。下面我们认识一下Stack在整个java集合体系中的位置:

我们会发现,其实Stack就是继承自Vector,因此它具有Vector的一般特点。我们把Stack放大,从Stack的角度来看一下:

从上图我们可以看到,Stack其实就是继承了Vector,Vector具有的接口的父类,Stack也有。

继承了AbstractList、实现了Enumeration、List、ListIterator等接口。

下面我们再来看一下源码,它的源码那是超级简单。

二、源码分析

一下源码基于jdk1.8来分析的。

(1)构造方法

publicStack(){}

只有一个无参构造方法。

(2)增加元素

这里面调用了addElement方法,我们追踪进去,继续往里看

synchronized 说明了这是一个线程安全的方法,他分了三步走的战略:

第一步:它在添加元素的时候首先将modCount加1,保证线程安全。第二步:ensureCapacityHelper()主要用于保障Stack的容量,在合理范围第三步:真正实现元素的添加,将该元素添加到栈顶,数目加1;(3)删除元素

在这里我们发现,真正实现删除操作的是removeElementAt;我们追踪进去:

synchronized 说明了这是一个线程安全的方法,删除操作就有点复杂了,没关系我们继续分析:

第一步:它在添加元素的时候首先将modCount加1,保证线程安全。第二步:第一个if判断删除元素是否超出了存储的数量范围第三步:第二个if判断待删除的元素下标大于0第四步:第三个if将元素后移第五步:将数量减小1第六步:将最上面的元素置为空,也就是删除了元素。(4)查找操作

在上面删除的时候我们发现了其实有一个peek()方法我们没有将,他的作用就是返回stack中最顶端的元素。

但是还有一个最正式的查找操作:

该方法返回所查找对象所处的位置,如果不存在在返回-1;

第一步:通过lastLindexOf(Object)方法返回从栈底到栈顶最下面的的那个元素的下标,第二步:利用元素的总数目减去所处的下标就得到了元素的位置(),并且返回否则返回-1;(5)其他方法

这里提供的其他方法只有一个判断是否为空

以上就列出了Stack的所有源码,超级简单。最后我们就来对它进行有一个总结

三、总结

stack是继承自Vector,底层使用数组存储、用来模拟栈的一个java集合。同时也是线程安全的。使用场景比如说倒序输出、XML语法检查。最主要的是面试还经常使用到它,因此你主要还是在机试的时候灵活的去使用它。

JAVA容器_java集合容器之Stack相关推荐

  1. 映射表map(平衡二叉树实现)_手动实现Java集合容器之TreeMap(上)

    上一篇我们手写了HashMap,还有一个很重要的Map的实现类TreeMap.打开源码第一句话:* A Red-Black tree based {@link NavigableMap} implem ...

  2. java 容器_JAVA的容器

    JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtab ...

  3. java 容器_Java容器框架学习整理

    一:容器框架概述 1.什么是容器 2.Java 中的容器 二:Collectoin 容器 1.Collection 接口定义 2.Collection 三个重要的子接口 List.Set.Queue ...

  4. java 容器_java容器考点总结和源码剖析!!!

    出自:https://github.com/CyC2018/CS-Notes 一.概览 Collection Map 二.容器中的设计模式 迭代器模式 适配器模式 三.源码分析 ArrayList V ...

  5. java容器有哪些如何使用_Java容器有哪些?

    网易面试: 问:Java容器有哪些,你聊一聊吧 Java容器: 数组,String,java.util下的集合容器 数组长度限制为 Integer.Integer.MAX_VALUE; String的 ...

  6. java数据容器_Java容器概览

    前言 因为去广州面试,已经好几天没有更新了,准备从这篇文章开始来回顾一下我所学的Java容器知识,首先对他们有一个大概的了解然后逐步深入源码来进行相关的分析. 为什么需要有容器 不止Java中有自己的 ...

  7. java服务容器_Java容器和Docker这种服务容器差别?

    weipeng2k Java容器技术和docker技术可以看做是一个互补的技术.我们在虚拟机基础上创建了多个docker容器,而一个docker容器在应对一些低流量的系统时,最低还是需要分配4核8G左 ...

  8. 容器适配器之stack用法总结

    容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能.之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能. stack容器适配器中的数据是以 LIF ...

  9. java 连接mongodb 集群_Java 连接MongoDB集群的几种方式

    先决条件 先运行mongodb肯定是必须的,然后导入以下包: import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; im ...

最新文章

  1. 在js中使用HashMap数据结构,在js中使用K,V数据结构
  2. mysql干货——数据库字符集和校对规则详解
  3. 所有竞争,本质都是“硬核能力”之争
  4. 【PowerBi】Power Query导入Excel数据
  5. 第六节:又一种新的数据类型:元组Tuple
  6. java怎么实现打牌_JAVA入门第三季实战:简易扑克牌
  7. 【NLP】Stanford
  8. Character Studio
  9. 移动平台开发项目(推箱子小游戏)
  10. 网络盒子android系统版本怎样刷机,【当贝市场】一键通IPTV盒刷Android系统教程
  11. 正交多项式-勒让德多项式,两类切比雪夫多项式及零点,拉盖尔多项式,埃尔米特多项式
  12. C# 利用 OleDb 组件操作 Excel 进行文件读写操作
  13. 机器视觉——远心镜头(1)
  14. 中标麒麟 NeoKylin-SDK 里都有哪些库文件
  15. python学习——HTMLParser
  16. MOSFET的误启动发生机制-3
  17. Docute超简单的文档工具
  18. intellij idea svn不能更新和提交
  19. Matlab 图片转gif
  20. 仿蚂蚁金服AntV框架蚂蚁数据可视化F2 基金折线图、对比图(包含买卖点、自定义标签等,注释详尽)

热门文章

  1. 强悍的 ubuntu —— ubuntu 与 windows 双系统的交互
  2. 面向对象——面向客户端编程
  3. acl在内核里的位置_在Linux中使用ACL(访问控制列表)保护文件/目录
  4. python手机版-QPython,一个在手机上运行Python的神器
  5. python工资一般多少-Python就业都有哪些岗位?每个岗位薪资多少?
  6. python入门经典100题-Python基础训练100题(带答案)[DOC][47KB]
  7. python函数定义及调用-python 函数定义及调用
  8. 广义表取表头表尾_数据结构广义表的递归算法
  9. git推送代码的命令详解
  10. echarts 引用地图的json