一、特点:LIFO, (Last In First Out)
二、基本操作:
- push(入栈)
- pop(出栈)
三、可以用数组实现
四、Java实现
java.util.Stack继承java.util.Vector(向量)
由于以下原因已不推荐使用
1 . 使用synchronized关键字影响效率
2 . 使用继承
Vector 类的实现和 ArrayList 比较接近,都是基于数组及扩容操作来完成的。只是 Vector 类为了保证线程安全性,在每个方法的声明中都使用了 synchronized 关键字,这势必会影响它的性能。Satck 类则是扩展了 Vector 类,实现了栈的各种操作。由于 Stack 类继承自 Vector,则同样继承了 Vector 类的各种方法。这个其实比较奇怪,因为对栈操作只需要入栈和出栈操作就可以了,完全可以不使用继承的方式,而使用包含的方式,即在Satck对象中使用 Vector 的引用。之所以采用了继承的方式,估计还是因为历史的包袱吧。
官方已经不推荐使用 Vector 和 Stack。
要使用线程安全的 List,可以用 Collections.synchronizedList 来包裹 ArrayList,或者java.util.concurrent.CopyOnWriteArrayList
至于栈,则推荐使用 Deque 接口的实现,如 LinkedList 和 ArrayDeque。或者java.util.concurrent.ConcurrentLinkedDeque 或者java.util.concurrent.ConcurrentLinkedQueue
五、应用
- Java虚拟机中,每个线程实例都有自己的栈。
- 方法栈
- 操作数栈
- 括号匹配、html标签匹配等
参考:
http://blog.jrwang.me/2016/java-collections-vector-stack/