【JDK源码剖析】Stack -- 栈
2019-07-13 19:45
120 查看
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
文章目录
概述
Stack类代表后进先出(LIFO, last-in-first-out)堆栈的对象。 它扩展了Vector,允许一个向量被视为堆栈。
提供了push和pop操作,还有测试堆栈是否为empty的方法,以及通过search对象,找到该对象在此堆栈上的基于栈底的位置。
我们下面会对Stack源码进行解析
public class Stack<E> extends Vector<E>
Stack<E> 继承了Vector<E>, 按道理说应该先介绍一下Vector集合框架的源码, .
但是如果Vector和Stack放在一起说的话 , 会显得很冗余 , 之后的源码剖析的类也很有可能继承自vector , 今后肯定会专门写博文好好介绍一下集合框架这个大家族,所以这里不再对vector有很专门的介绍了 。
Stack类
Stack的类图
静态字段
这个与序列化有关
private static final long serialVersionUID = 1224463164541339165L;
构造方法
//创建一个空栈 public Stack() { }
刚初始化的时候 因为继承自Vector的缘故,该动态数组的默认大小为 10:
普通方法
添加元素
//添加元素 返回值是添加的元素 public E push(E item) { addElement(item); return item; }
addElement这个方法继承自Vector 添加一个元素
删除元素
//线程安全 删除栈顶元素 并返回该栈顶元素 public synchronized E pop() { E obj; int len = size(); obj = peek(); removeElementAt(len - 1); return obj; } public synchronized E peek() { int len = size(); if (len == 0) throw new EmptyStackException(); return elementAt(len - 1); }
removeElementAt 与 elementAt均继承自vector
size()继承vector 值为vector的元素个数
这段源码来自Vector
public synchronized int size() { return elementCount; }
判断是否为空
public boolean empty() { return size() == 0; }
查找指定元素的位置
这里加锁 是线程安全的
public synchronized int search(Object o) { int i = lastIndexOf(o); if (i >= 0) { return size() - i; } return -1; }
lastIndexOf也是继承自Vector
代码逻辑简单不妨在这里看一下
public synchronized int lastIndexOf(Object o) { return lastIndexOf(o, elementCount-1);//elementCount为元素数量 } public synchronized int lastIndexOf(Object o, int index) { if (index >= elementCount) throw new IndexOutOfBoundsException(index + " >= "+ elementCount); if (o == null) { for (int i = index; i >= 0; i--) if (elementData[i]==null) return i; } else { for (int i = index; i >= 0; i--) if (o.equals(elementData[i])) return i; } return -1; }
API起到很好的总结作用呀
外加一个size() 标识元素个数 通过Stack,以后栈的使用就能为所欲为了
相关文章推荐
- 给jdk写注释系列之jdk1.6容器(10)-Stack&Vector源码解析
- jdk源码剖析一:OpenJDK-Hotspot源码包目录结构
- jdk源码剖析之LinkedList
- jdk源码剖析三:锁Synchronized
- JDK源码剖析之ArrayList浅析
- jdk动态代理源码剖析
- 【动态代理】从源码实现角度剖析JDK动态代理
- 【JDK源码剖析】Queue--队列 PriorityQueue--优先队列
- Stack源码简单剖析
- 动态代理-JDK 源码剖析(一):简单示例
- 动态代理-JDK 源码剖析(二):源码剖析
- JDK1.8HashMap源码的简单剖析(1)
- JDK源码剖析与最佳实践—ArrayList
- jdk源码剖析之ArrayList
- 从JDK里Stack源码的角度重温栈的实现
- JDK 1.8 Vector与Stack源码分析
- 【小笨鸟看JDK1.7集合源码之二】ArrayList源码剖析
- Java源码剖析之Stack
- 给jdk写注释系列之jdk1.6容器(10)-Stack&Vector源码解析