JDK底层实现源码分析系列(三) Stack源码分析
“合抱之木 生于毫末 九层之台 起于累土 千里之行 始于足下”
前言
JDK 版本1.7
Collection 大家族
Stack 继承树
分析
Stack从字面上理解就是栈,先进后出,继承Vector也就是说他完全可以当做Vector使用,并且他内部只增加了5个方法用来实现栈的特性
之前已经讲过Vector的源码分析了,本篇就只讲讲他是如何实现先进后出的
- public boolean empty()
- public synchronized E peek()
- public synchronized E pop()
- public E push(E item)
- public synchronized int search(Object o)
从上面的方法可以看出Stack对取出数据的操作都加了synchronized,说明他是支持并发取出数据的
peek()和pop()的区别仅在于前者不会删除元素,后者会
另外多了个search(Object o) 搜索最后出现的此元素元素
/**
* 本质上还是调用父类的方法lastIndexOf来确定最后出现此元素的索引
*/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
总结
Stack的源码还是很简单的,只比Vector多了几个方法用来实现栈的特性
其实实现栈可以使用LinkedList来实现,LinkedList和Stack实现栈的区别只在于LinkedList底层是使用链表来存储数据的,而Stack是使用数组存储的
在选择使用哪个的时候看是否需要频繁的删除或插入指定index的数据
如果频繁那只能选择LinkedList,反之一定得选择Stack,底层的存储数据的结构不同导致他们的使用场景都各有优势
著作权声明
本文首次发布于 Binux Blog,转载请保留以上链接