java_集合体系之Stack详解、源码及示例——06
一:Stack结构图
简单说明:
1、上图中虚线且无依赖字样、说明是直接实现的接口
2、虚线但是有依赖字样、说明此类依赖与接口、但不是直接实现接口
3、实线是继承关系、类继承类、接口继承接口
二:Stack类简介:
Stack(栈)、见名知意、是以栈的形式来存储数据、其特点是先进后出(FILO)、同时Stack继承与Vector、所以如果把Stack内部的实现也是通过动态数组来实现的、而不是其他的数据结构。在List体系中有个LinkedList是以双向链表的数据结构来存储数据的、所以使用LinkedList完全可以达到Stack的效果、但是Stack不能作为双向链表来使用、并且LinkedList不是线程安全的、而Stack是线程安全的、对于Stack、连他父类Vector都不被推荐使用了、Stack的命运也逃不掉被雪藏、他和其父类的存在意义只是为Collection兼容性做点贡献。
三:Stack API
1、构造方法
Stack()
2、一般方法
boolean empty()
synchronized E peek()
synchronized E pop()
E push(E object)
synchronized int search(Object o)
四:Stack源码分析
package com.chy.collection.core;
public class Stack<E> extends Vector<E> {
/** 默认无参构造方法*/
public Stack() {
}
/** 将一个元素压入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;
}
/** 查找指定对象o在栈中的索引*/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
/** 默认版本号 */
private static final long serialVersionUID = 1224463164541339165L;
}
总结:Stack继承与Vector、它具有Vector所具有的所有功能、同时从Stack源码中可以看出、作为Stack结构、它提供了用于操作栈结构的方法、压入、弹出、查看、搜索、这几个方法内部的实现都是通过调用父类Vector的方法来实现的。
五:Stack示例
1、遍历方式:Stack遍历方式与Vector完全相同、可以参考前面一章:Vector的相关内容、这里不再赘述。
2、示例:
package com.chy.collection.example;
import java.util.Stack;
public class StackTest {
/**
* 这里仅仅测试Stack源码中提供的方法、而不再测试Stack从Vector中继承的方法、所以示例也很简单
*/
private static void testStack(){
//初始化一个含有字符“abcde”的Stack
Stack<String> stack = new Stack<String>();
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
stack.push("e");
//查看Stack中栈顶元素
System.out.println("the top element of stack : " + stack.peek());
System.out.println(stack);
//查看并弹出Stack栈顶元素
System.out.println("the top element of stack : " + stack.pop());
System.out.println(stack);
//查看Stack是否包含“e”
System.out.println("the index of 'e' in stack : " +stack.search("e"));
//查看Stack是否为空
System.out.println("is the stack empty? " + stack.empty());
}
public static void main(String[] args) {
testStack();
}
}
总结:
对Stack、同其父类一样、早已不推荐使用、这里也只是针对Stack源码中提供的方法进行了分析、如果真要使用栈这种结构来实现数据存储、推荐使用Deque 接口及其实现提供了LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类。权当了解!