概述
上次学习了Vector,今天学习Stack,这也是Collecton集合下最后解析的一个了.Stack比较简单,它直接继承自Vector. 学习内容分为下面几个部分:
- Stack简介
- 数据结构分析
- 源码解析(基于JDK1.8)
Stack简介
|
|
Stack是栈,直接继承自Vector,它的特点是先进后出(FILO,first in last out).
java工具包的Stack是继承矢量队列的,由于Vector是通过数组实现的,这意味着Stack也是通过数组实现的,而非链表.当然我们也可以把LinkedList作为栈来使用看这里!!
Stack的构造方法
Stack只有一个构造方法,如下:1public Stack()
Stack的API
|
|
数据结构分析
在Java集合系列[5]-Vector分析与源码解析一文已经详细介绍过Vector的数据结构了,这里就不对Stack的数据结构进行说明,因为Stack的数据结构和Vector的一模一样的.
Stack的继承关系
|
|
Stack与Collection的关系
源码解析
源码解析
|
|
总结
- Stack实际上也是通过数组去实现的.
- 执行push时,是通过将元素添加到数组为末尾;
- 执行peek时,是返回数组末尾的元素;
- 执行pop时,是删除并返回数组末尾的元素;
- Stack继承Vector,意味着Vector所拥有的属性和功能,Stack都拥有.
Stack设计上存在的问题
根据JDK官方文档的介绍:123A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class. For example: Deque<Integer> stack = new ArrayDeque<Integer>();
Deque接口及其实现提供了LIFO堆栈的操作,它们提供了更完整和更一致的操作.所以应该优先使用这个接口,而不是Stack.比如ArrayDeque.
其实,JDK通过Vector来实现Stack这个设计是存在问题的.理由如下:
- Stack仅仅是为了使用Vector的几个方法,而其他大部分方法都没有使用,造成很多方法冗余,要知道Stack和Vector在设计理念上毫无关系啊;
- 鉴于1,Stack设计上的不严谨,Vector中有个方法
public void add(int index, E element)
,它可以在栈中任意位置添加元素,这于Stack的设计理念相冲突; - Stack大部分是增加和删除操作,很少查找元素,这很应该用链表去实现,而不是Vector的数组(效率受影响),这里也是很多人质疑Stack的地方;