文章目录
  1. Vector和Stack源码分析
  2. 1. Vector与ArrayList
  3. 2. Vector在java1.6和1.7
  4. 3. 含Element的方法
    1. 3.1 elements()
    2. 3.2 firstElement()和lastElement()
    3. 3.3 crud操作
  5. 4. Stack
    1. 4.1 push
    2. 4.2 pop
    3. 4.3 peek
    4. 4.4 empty
    5. 4.5 search

[TOC]

Vector和Stack源码分析

1. Vector与ArrayList

作为底层都是采用动态数组作为实现基础的类,Vector和ArrayList在很多方面都是大同小异的。在阅读之前本文之前可以先阅读ArrayList的源码解析,然后Vector基本就一目了然了。
说下他们的主要区别:

1. Vector里面的方法都是同步的,线程安全的。
2. Vector的扩容大小与ArrayList不同,Vector1.6和1.7中都是上一次大小的2倍。
3. Vector多了许多包含Element的方法 (Vector的子类栈Stack实际采用的是这些方法)

其次Vector比ArrayList还多了一个成员变量 capacityIncrement, 可以通过构造方法指定

1
2
3
4
5
6
7
8
9
// 自定义的扩容增长大小, 可以通过构造方法指定大小
protected int capacityIncrement;
// 在扩容的时候会使用到
// 1.6
int newCapacity = (capacityIncrement > 0) ?
(oldCapacity + capacityIncrement) : (oldCapacity * 2);
// 1.7
int newCapacity = oldCapacity +
((capacityIncrement > 0) ? capacityIncrement : oldCapacity);

然后如果不指定数据数组的大小,那么就和ArrayList一样,Vector的默认大小也是10。其余与ArrayList名称相同的方法,实现上没什么大的区别。

2. Vector在java1.6和1.7

Vector在1.6和1.7基本没多少大的区别,首先在初始化上也基本相同。没有像ArrayList从1.6升到1.7,在调用构造方法的时候还有一点小的改动。
其次和ArrayList一样,Vector1.7将iterator()和listIterator()方法以及对应的内部类都有了自己的实现,不在采用父类中的方法。

3. 含Element的方法

3.1 elements()

1
public Enumeration<E> elements() {...}

这个方法返回 Enumeration 接口的实现,与 iterator() 返回的 Iterator 接口实现基本一样,Enumeration 接口貌似由于方法名称太长、功能与Iterator 接口重复原因,后来建议使用Iterator 接口。。。

3.2 firstElement()和lastElement()

1
2
public synchronized E firstElement() {...}
public synchronized E lastElement() {...}

顾名思义,返回第一个元素和最后一个元素,如果元素不存,则抛出 NoSuchElementException 异常

3.3 crud操作

1
2
3
4
5
6
7
8
9
10
11
12
// 获取指定索引的元素
public synchronized E elementAt(int index) {}
// 设置某个索引的元素
public synchronized void setElementAt(E obj, int index) {}
// 新增一个元素
public synchronized void addElement(E obj) {}
// 删除元素
public synchronized void removeElementAt(int index) {}
public synchronized boolean removeElement(Object obj) {}
public synchronized void removeAllElements() {}
// 在某个索引前插入某个元素
public synchronized void insertElementAt(E obj, int index) {}

闻其名而知其意,内部实现与传统的add,get,remove的实现基本一样。

4. Stack

是数据结构中一种很重要的数据结构类型。java提供了其实现Stack类
首先,Stack在java1.6和1.7源码一模一样。。
Stack是Vector的子类,大部分的方法都继承于Vector,且自己类中的方法也是同步的。
Stack中主要方法如下:

4.1 push

往栈中插入一个元素

1
2
3
4
public E push(E item) {
addElement(item);
return item;
}

4.2 pop

从栈中弹出一个元素(删除返回),实际从Vector中数组末尾删除并返回

1
2
3
4
5
6
7
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}

4.3 peek

获取栈顶的元素,但不删除。

1
2
3
4
5
6
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}

4.4 empty

判断栈是否为空,感觉还不如用isEmpty()

1
2
3
public boolean empty() {
return size() == 0;
}
1
2
3
4
5
6
7
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}

综上:stack中的方法也是特别的简单,无非也就是取了个有意义的方法名称而已,具体实现还是沿用了Vector中的方法。

文章目录
  1. Vector和Stack源码分析
  2. 1. Vector与ArrayList
  3. 2. Vector在java1.6和1.7
  4. 3. 含Element的方法
    1. 3.1 elements()
    2. 3.2 firstElement()和lastElement()
    3. 3.3 crud操作
  5. 4. Stack
    1. 4.1 push
    2. 4.2 pop
    3. 4.3 peek
    4. 4.4 empty
    5. 4.5 search