源码分析 (三) Stack 源码分析

简介

zdjcgx.png

栈是数据结构中一种很重要的数据结构类型,因为栈的后进先出功能是实际的开发中有很多的应用场景。Java API中提供了栈(Stacck)的实现。Stack类继承了Vector类,而Vector类继承了AbstractList抽象类,实现了List类,Cloneable接口,RandomAcces接口以及Serializable接口。

源码阅读

  • 构造函数

    创建一个空的栈

/**
 * Creates an empty Stack.
 */
public Stack() {
}
复制代码
  • 入栈
public E push(E item) {
    addElement(item);

    return item;
}
复制代码

这里的 addElement( E item) 方法是 Vector 中的方法,点开此方法可以看到 是在检查当前的容量是否满足如果不满足就去开辟一个新的容量。

  • 出栈
public synchronized E pop() {
    E       obj;
    // 拿到当前栈里面的长度
    int     len = size();
	// 获取到 len - 1 也就是 Vector 中尾部数据
    obj = peek();
    // 也是调用 Vector 中 删除元素的函数
    removeElementAt(len - 1);

    return obj;
}
复制代码
  • 检查栈里面的数据
/**
 * Tests if this stack is empty.
 *
 * @return  <code>true</code> if and only if this stack contains
 *          no items; <code>false</code> otherwise.
 */
public boolean empty() {
    return size() == 0;
}
复制代码

主要检查栈里面是否是空数据

  • 查找元素到栈顶的位置
public synchronized int search(Object o) {
    //调用父类的方法,根据元素对象获取存在数组中的索引位置
    int i = lastIndexOf(o);

    if (i >= 0) {
        return size() - i;
    }
    return -1;
}
复制代码

总结

通过 Stack 的源码可以查看到 它的父类 Vector 底层是一个数组结构,Vector 是 JDK 1.0 的基本上很多方法都是同步线程安全的,在多线程中使用是安全的,但是效率会降低。

猜你喜欢

转载自juejin.im/post/5c946d525188252d5f0fd9ee