第1部分 Stack介绍
Stack简介
Stack继承了Vector并使用其方法,因此是线程安全的。
Stack左侧,即索引为0的位置为栈底,入栈时元素在最后添加,出栈从最后删除。
Stack构造函数
修饰语和返回类型 | 方法 | 描述 |
---|---|---|
public | Stack() | 默认构造方法 |
Stack常用API
修饰语和返回类型 | 方法 | 描述 |
---|---|---|
E | push(E item) | 元素入栈 |
E | pop() | 元素出栈 |
E | peek() | 获取栈头元素,但不移除 |
boolean | empty() | 判断是否为空 |
int | search(Object o) | 找到栈中第一个出现o的位置 |
第2部分 Stack数据结构
Stack的继承关系
java.lang.Object
↳ java.util.AbstractCollection<E>
↳ java.util.AbstractList<E>
↳ Vector<E>
public class Stack<E> extends Vector<E>{}
Stack的关系图
图1 Stack的关系图
第3部分 Stack源码解析(基于JDK-8u201)
public class Stack<E> extends Vector<E> {
public Stack() {
}
public E push(E item) {
addElement(item);
return item;
}
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);
}
public boolean empty() {
return size() == 0;
}
//注意栈头是在右侧,因此是从右往前搜索
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
//返回的位置,从栈头开始算
return size() - i;
}
return -1;
}
private static final long serialVersionUID = 1224463164541339165L;
}
以上源码比较短,而且除了search方法外,其他的方法都比较简单,读者可以自行分析。
第4部分 Stack使用示例
public class Test3 {
public static void main(String[] args) {
Stack<Integer> stack=new Stack<>();
stack.push(1);//[1]
stack.push(2);//[1,2]
stack.search(1);//return 2
stack.peek();//return 2,but no change
stack.forEach(s->System.out.print(s+" "));//return "1 2"
stack.pop();//return 2,and change to [1]
}
}
值得一提的是,虽然Stack的栈头是在右侧,但是Stack并没有重写Iterable的forEach方法,而是Vector中重写的方法,因此,迭代顺序还是从左往右的。
//stack.forEach的输出
1 2