这篇文章开始介绍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)构造方法

public Stack() {}

只有一个无参构造方法。

(2)增加元素

public E push(E item) {addElement(item);return item;
}

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

public synchronized void addElement(E paramE) {this.modCount += 1;ensureCapacityHelper(this.elementCount + 1);this.elementData[(this.elementCount++)] = paramE;
}

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

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

(3)删除元素

public synchronized E pop() {E  obj;int  len = size();obj = peek();removeElementAt(len - 1);return obj;
}

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

public synchronized void removeElementAt(int paramInt) {this.modCount += 1;if (paramInt >= this.elementCount)throw new ArrayIndexOutOfBoundsException(paramInt + " >= "+ this.elementCount);if (paramInt < 0)throw new ArrayIndexOutOfBoundsException(paramInt);int i = this.elementCount - paramInt - 1;if (i > 0)System.arraycopy(this.elementData, paramInt + 1, this.elementData,paramInt, i);this.elementCount -= 1;this.elementData[this.elementCount] = null;
}

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

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

(4)查找操作

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

public synchronized E peek() {int  len = size();if (len == 0)throw new EmptyStackException();return elementAt(len - 1);
}

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

public synchronized int search(Object o) {int i = lastIndexOf(o);if (i >= 0) {return size() - i;}return -1;
}

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

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

(5)其他方法

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

public boolean empty() {return (size() == 0);
}

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

三、总结

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

java 取栈顶元素_java集合系列(7)Stack相关推荐

  1. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

  2. 指针实现入栈、出栈、取栈顶元素

    #include<stdio.h> #define MAXSIZE 100typedef struct{int *base;int *top;int stacksize; }SqStack ...

  3. 数据结构 -- 栈的基本操作(入栈、出栈、取栈顶元素)

    目录 栈的基本操作(顺序栈) 栈的基本操作(链栈) 栈的基本操作(顺序栈) 初始化栈: #define MAXSIZE 5 typedef struct {int *top;int *base;int ...

  4. 链栈的定义、构建、入栈、出栈和取栈顶元素

    一.链栈的定义: #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typedef int S ...

  5. 【C++】【数据结构】顺序栈的基本操作(初始化、入栈、出栈、取栈顶元素、遍历输出栈)的算法实现附全代码

    C++实现顺序栈的算法+步骤(附全代码): 使用c++完成数据结构顺序栈的基本操作,包括(初始化.入栈.出栈.取栈顶元素.遍历输出栈等),可直接编译运行. 顺序栈的定义如下: #define MAXS ...

  6. C语言链栈(基本压栈,弹栈,取栈顶元素)

    C语言链栈(基本压栈,弹栈,取栈顶元素) #include <stdio.h> #include <stdlib.h> #include <stdbool.h>ty ...

  7. java list 博客园_Java集合系列(一)List集合

    List的几种实现的区别与联系 List主要有ArrayList.LinkedList与Vector几种实现. ArrayList底层数据结构是数组, 增删慢.查询快; 线程不安全, 效率高; 不可以 ...

  8. list 置顶元素_java集合指定元素排序:最前,按照提供的顺序排序?求算法

    哈哈哈,不好意思,问了题主那么久...根据我获得需求描述,最后我还是觉得引用新的编程元素来使业务稍微变简单的,我整理到需求应该是: 首先给定一个指定关键字的排序,给出一个字符串列表,对列表进行排序,若 ...

  9. java栈顶元素_栈在Java类库中的实现

    栈是一种后进先出的数据结构.在它之上,主要有三种操作: (1)判断栈是否为空--empty(): (2)在栈顶添加一个元素--push(E): (3)删除并返回栈顶元素--pop(). 在Java类库 ...

最新文章

  1. 全球3D机器视觉技术引领者,银牛微电子强势登陆中国市场
  2. 高质量程序程序设计指南摘录
  3. Spring RestTemplate中文乱码解决方案
  4. Adobe Flash Player 10.0.32.18
  5. mysql sycho_Java面试题 - osc_p1rj1z8j的个人空间 - OSCHINA - 中文开源技术交流社区
  6. USACO 2.1 健康的好斯坦奶牛 (DFS)
  7. [机器学习]TF-IDF是什么
  8. uva 436 Arbitrage (II)
  9. python连接db2数据库 import的包_python 连接DB2数据库
  10. 大数据安全问题的类型有哪些
  11. Mac使用OpenCV项目步骤
  12. 网页视频之H264打包为fmp4调研
  13. 【Prison Break】第七天(4.3)
  14. [评价体系] 2、层次分析法AHP原理、例题
  15. Teechart图表应用技术详解—第三章之在图表上自行绘制
  16. 粒子群算法-讲解+实例
  17. svn访问路径提示Unable to connect to a repository at url
  18. Cosmos 是什么?
  19. 低代码和零代码火了,十大利器推荐
  20. 如何优雅的美化kali,实现双桌面环境

热门文章

  1. 怎么搜索php文件内容,linux怎么搜索文件
  2. isFinite使用说明
  3. Android 内存泄漏检测工具
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的教材管理系统
  5. 从Windows复制文件到Linux显示乱码问题
  6. Confluence 6 配置 workbox 通知
  7. mysqli_fetch_row,mysqli_fetch_array,mysqli_fetch_assoc区别
  8. Too many open files 问题的解决
  9. ThinkPHP框架 _ 学习5
  10. 利用Sigar获取系统信息