前言
先看下一幅图
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。