Stack分析

第1部分 Stack介绍

Stack简介

Stack继承了Vector并使用其方法,因此是线程安全的。
Stack左侧,即索引为0的位置为栈底,入栈时元素在最后添加,出栈从最后删除。

Stack构造函数

修饰语和返回类型方法描述
publicStack()默认构造方法

Stack常用API

修饰语和返回类型方法描述
Epush(E item)元素入栈
Epop()元素出栈
Epeek()获取栈头元素,但不移除
booleanempty()判断是否为空
intsearch(Object o)找到栈中第一个出现o的位置

第2部分 Stack数据结构

Stack的继承关系

java.lang.Object
   ↳     java.util.AbstractCollection<E>
         ↳     java.util.AbstractList<E>
               ↳     Vector<E>

public class Stack<E> extends Vector<E>{}

Stack的关系图
在这里插入图片描述
图1 Stack的关系图

第3部分 Stack源码解析(基于JDK-8u201)

public class Stack<E> extends Vector<E> {
    public 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;
    }
    //注意栈头是在右侧,因此是从右往前搜索
    public synchronized int search(Object o) {
        int i = lastIndexOf(o);
        if (i >= 0) {
        	//返回的位置,从栈头开始算
            return size() - i;
        }
        return -1;
    }
    private static final long serialVersionUID = 1224463164541339165L;
}

以上源码比较短,而且除了search方法外,其他的方法都比较简单,读者可以自行分析。

第4部分 Stack使用示例

public class Test3 {
	public static void main(String[] args) {
		Stack<Integer> stack=new Stack<>();
		stack.push(1);//[1]
		stack.push(2);//[1,2]
		stack.search(1);//return 2
		stack.peek();//return 2,but no change
		stack.forEach(s->System.out.print(s+" "));//return "1 2"
		stack.pop();//return 2,and change to [1]
	}
}

值得一提的是,虽然Stack的栈头是在右侧,但是Stack并没有重写Iterable的forEach方法,而是Vector中重写的方法,因此,迭代顺序还是从左往右的。

//stack.forEach的输出
1 2 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值