java.util.Stack源码解析
2018-02-27 本文已影响0人
sunpy
准备知识
Stack类采用的是动态数组栈实现的,规则后进先出,从栈顶压入元素、从栈顶弹出元素。栈实际上是一种添加了后进先出规则的顺序表。Stack类是在Vector类的基础上进行继承并扩展功能。
https://www.jianshu.com/p/532a6e161112
所属包
package java.util;
继承与实现关系
public
class Stack<E> extends Vector<E>
构造方法
/**
* 创建一个栈的空构造方法
*/
public Stack() {
}
方法
push方法,将元素压入栈
/**
* 将元素item压入栈中
*/
public E push(E item) {
addElement(item);
return item;
}
public synchronized void addElement(E obj) {
modCount++;
//进行扩容操作
/**
* 增加此向量的容量(如有必要),以确保其至少能够保存最小容量参数指定的组件数。
* 如果当前数组的容量小于minCapacity,那么就增加容量,增加数组长度
* 新数组的长度等于原数组的长度加上增量capacityIncrement。
* 如果增加capacityIncrement小于等于0,那么就自动扩增为原来二倍。
* 如果扩增为原来的二倍还是比minCapacity小,那么就将minCapacity作为Object数组的长度。
*/
ensureCapacityHelper(elementCount + 1);
//在栈顶插入元素
elementData[elementCount++] = obj;
}
pop方法,从栈顶弹出元素,并且在栈中将该元素删除
/**
* 从栈顶弹出元素
*/
public synchronized E pop() {
E obj;
int len = size();
//获取栈顶元素,但是不弹出元素
obj = peek();
//删除该栈顶元素
removeElementAt(len - 1);
return obj;
}
peek方法,从栈中取出元素值,但是不删除栈中的值
/**
* 获取下标为数组长度减一也就是最后的值,也符合栈的规则,从栈顶弹出元素
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
public synchronized E elementAt(int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}
return elementData(index);
}
//通过索引来获取数组中对应的值
E elementData(int index) {
return (E) elementData[index];
}
阅读总结
(1)Stack动态栈是线程安全的。
(2)Stack是基于Vector动态数组结构实现的,只是控制进出元素的方式为后进先出的栈方式。
---------------------------该源码为jdk1.7版本的