Java 容器源码分析之 Vector 与 Stack

JDK 文档中对Vector的描述是这样的:Vector 类实现了一个可增长的对象数组。像数组一样,可以通过整型索引来获取内容,但是 Vector 的大小可以按照实际元素数量的需求进行增长或收缩。Vector 和 ArrayList 非常接近,区别在于 ArrayList 的实现是非同步的,在多线程环境中可能出现线程不安全的情况,而 Vector 则是线程安全的。
Stack 类实现的就是我们非常常用的一种数据结构,栈,也称之为后进先出队列(LIFO)。栈的基本概念自不必多说,Java 中 Stack 类是基于 Vector 来实现的。
实际上,Vector 和 Stack 类已经不被推荐使用了,之所以仍然还保留是出于兼容性方面的考虑。通常情况下可以使用 ArrayList 来替代 Vector,在一些需要保证线程安全的情况下在外部进行同步或者使用Collections.synchronizedList方法。至于 Stack,官方的推荐是使用 Deque 接口的实现进行替代。

  1. public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  2. class Stack<E> extends Vector<E>

从类的声明来看,Vector 类和 ArrayList 是完全一致的,实际上它们俩的内部实现也是大致相同的,只是 Vector 类中的所有方法都使用 synchronized 关键字进行了修饰。
image.png
image.png
image.png
。。。
Stack 就是 Vector 的子类,对栈的所有操作 pop()push()peek() 都是在 Vector 的基础上进行实现的。


add 与 push

  1. /**
  2. * Appends the specified element to the end of this list.
  3. *
  4. * <p>This method is equivalent to {@link #addLast}.
  5. *
  6. * @param e element to be appended to this list
  7. * @return {@code true} (as specified by {@link Collection#add})
  8. */
  9. public boolean add(E e) {
  10. linkLast(e);
  11. return true;
  12. }

add 也就是 addlast

List+Deque

image.png
LinkedList既实现List,也实现了Deque
既可以作为链表,也可以作为队列