简介
栈是数据结构中一种很重要的数据结构类型,因为栈的后进先出功能是实际的开发中有很多的应用场景。Java API中提供了栈(Stack) 的实现。Stack 类继承了 Vector 类,而 Vector 类继承了 AbstractList 抽象类,实现了 List 类,Cloneable 接口,RandomAcces 接口以及 Serializable 接口。
源码阅读
-
构造函数
创建一个空的栈
/** * Creates an empty Stack. */public Stack() {}复制代码
- 入栈
public E push(E item) { addElement(item); return item;}复制代码
这里的 addElement( E item) 方法是 Vector 中的方法,点开此方法可以看到 是在检查当前的容量是否满足如果不满足就去开辟一个新的容量。
- 出栈
public synchronized E pop() { E obj; // 拿到当前栈里面的长度 int len = size(); // 获取到 len - 1 也就是 Vector 中尾部数据 obj = peek(); // 也是调用 Vector 中 删除元素的函数 removeElementAt(len - 1); return obj;}复制代码
- 检查栈里面的数据
/** * Tests if this stack is empty. * * @returntrue
if and only if this stack contains * no items;false
otherwise. */public boolean empty() { return size() == 0;}复制代码
主要检查栈里面是否是空数据
- 查找元素到栈顶的位置
public synchronized int search(Object o) { //调用父类的方法,根据元素对象获取存在数组中的索引位置 int i = lastIndexOf(o); if (i >= 0) { return size() - i; } return -1;}复制代码
总结
通过 Stack 的源码可以查看到 它的父类 Vector 底层是一个数组结构,Vector 是 JDK 1.0 的基本上很多方法都是同步线程安全的,在多线程中使用是安全的,但是效率会降低。