转载地址:https://www.cnblogs.com/skywang12345/p/3308852.html
参考:jdk 1.7 源码
第1部分 Stack介绍
- Stack是栈。它的特性是:先进后出(FILO, First In Last Out)。
- java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。
第2部分 Stack关键属性
Stack继承于Vector,它包含了3个成员变量:elementData , elementCount, capacityIncrement。
1.) elementData 是"Object[]类型的数组",它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的>大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长,capacityIncrement是与容量增长相关的增长系数,具体的增长方式,请参考源码分析中的ensureCapacity()函数。
(02) elementCount 是动态数组的实际大小。
(03) capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时>,增加的大小都是capacityIncrement。
第3部分 Stack源码解析
package java.util;
public class Stack<E> extends Vector<E> {
// 无参构造函数
public Stack() {
}
// push函数:将元素存入栈顶(数组尾部)
public E push(E item) {
addElement(item);
return item;
}
// 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 boolean empty() {
return size() == 0;
}
// 查找“元素o”在栈中的位置:由栈顶向栈底方向数
// (数组尾部向数组头部查找)
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1224463164541339165L;
}
总结:
(01) Stack实际上也是通过数组去实现的。
执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
执行pop时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
(02) Stack继承于Vector,意味着Vector拥有的属性和功能,Stack都拥有。