java_集合体系之Stack详解、源码及示例——06

java_集合体系之Stack详解、源码及示例——06


一:Stack结构图


 java_集合体系之Stack详解、源码及示例——06_第1张图片


简单说明:

        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,而非此类。权当了解!


更多内容:java_集合体系之总体目录——00


你可能感兴趣的:(vector,java集合,stack,enumeration,Collection框架图)