1 Stack类
public class stack<E> extends Vector<E>
可以看出该类继承Vector类,由于Vector虽然是线程安全的但是性能较差,已经过时,一般情况下使用ArrayList作为栈使用。
因为Vector是当初JAVA曾经写得不太行的类,所以Stack也不太行。
Vector不行是因为效率不太行,很多方法都用了synchronized修饰,虽然线程安全,但是像ArrayDeque,LinkedList这些线程不安全的,在需要安全的时候也可以用Collections.synchronizedCollection()转化成线程安全的,所以Vector就没什么用处了
-
Deque
接口及其实现提供了更完整和一致的先进先出LIFO堆栈操作集,这些接口应优先于此类。 例如:Deque<Integer> stack = new ArrayDeque<Integer>();
- 1
- 缺点:
- 效率低
- Vector空间满了后,扩容是一倍,而ArrayList仅仅是一半
- Vector分配内存的时候需要连续的存储空间,如果数据太多,容易分配内存失败
2 Deque接口
双端队列,支持两端元素插入和移除的线性集合。有以下常用实现类:ArrayDeque、LinkedList。
- ArrayDeque:可调整大小的数组的实现的Deque接口。 数组deques没有容量限制; 他们根据需要增长以支持使用。 它们不是线程安全的; 在没有外部同步的情况下,它们不支持多线程的并发访问。 零元素被禁止。 当用作堆栈时,此类可能会比Stack快,并且当用作队列时速度高于LinkedList 。
- 数组结构
- 插入元素不能为null
- 无法确定数据量时,后期扩容会影响效率
- LinkedList:
- 链表结构
- 插入元素能为null
- 无法确定数据量时,有更好表现
3 deque实现栈时常用的方法
入栈 | push(E e) |
---|---|
出栈 | poll() / pop() 后者在栈空的时候会抛出异常,前者返回null |
查看栈顶 | peek() 为空时返回null |
入队 | offer(E e) |
---|---|
出队 | poll() 为空时返回null |
查看队首 | peek() 为空时返回null |