第九章 Java的集合之Vector 与 栈 Stack 源码分析

前言

先看下一幅图
在这里插入图片描述

Vector

Vector 和 ArrayList 都是继承的相同父类AbstractList,其内部具有相同的方法实现。因此它们属于兄弟关系。不过ArrayList 是一种线程不安全的集合,Vector是一种线程安全的集合,其原因是所有Api都加上了同步关键字synchronized。在其他方面,它们长得一模一样,不管是内部维护的数组还是其Api实现的方法。因此要详细了解Vector只需要详细了解了ArrayList就可以了。下面附上ArrayList的源码分析地址:
第六章 JAVA的集合之ArrayList源码分析

Stack

从上图中可以看到,Stack继承了Vector,因此它内部也维护着一个数组,有些api也是被synchronized修饰过的,因此也是一个线程安全的集合。具体详情下面开始分析。
stack是Vector的子类,除了继承父亲的功能以外,它还提供了一些栈操作,如push、pop、peek。大概功能如下:

public E push(E item)        // 将元素放在栈顶,栈顶,也是就数组elementData的末尾。
public synchronized E pop()  // 删除栈顶元素
public synchronized E peek() // 获取栈顶元素
public boolean empty()   
public synchronized int search(Object o)  // 从栈顶向下寻找元素,也就是从elementData的尾部向头部寻找。

push(E item)

public E push(E item) {
    addElement(item);

    return item;
}

这个方法没有用synchronized修饰,也就是说可以同时向栈顶添加元素吗?其实不是,它内部调用了addElement()方法,这个方法是被synchronized修饰过的。

pop()

public synchronized E pop() {
    E       obj;
    int     len = size();

    obj = peek();
    removeElementAt(len - 1);

    return obj;
}

peek()

 public synchronized E peek() {
    int     len = size();

    if (len == 0)
        throw new EmptyStackException();
    return elementAt(len - 1);
}

search(Object o)

public synchronized int search(Object o) {
    int i = lastIndexOf(o);

    if (i >= 0) {
        return size() - i;
    }
    return -1;
}

以上代码都比较简单,就不再分析。
需要说明的是,底层采用数组来实现的集合,其内部在增加元素时,都需要考虑扩容,不论是ArrayList 、 Vector 还是 Stack。

猜你喜欢

转载自blog.csdn.net/weixin_43901067/article/details/105052611