您的位置:首页 > 编程语言 > Java开发

【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,以后栈的使用就能为所欲为了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: