Java 7之集合类型 - Vector与Stack

时间:2022-08-09 16:59:09

转载出处:http://blog.csdn.net/mazhimazh/article/details/19568867


1、Vector 


Vector类也是基于数组实现的队列,代码与ArrayList非常相似,只不过在可能发生线程安全的方法上加上了Synchornized关键字,使得其执行的效率相比ArrayList就低了。在这个类中有三个重要的变量定义,如下:

[java] view plain copy print?
  1. protected Object[] elementData;  
  2. protected int elementCount;      // 动态数组中存储元素的个数  
  3. protected int capacityIncrement;   

 来解析一下如上两个变量:

  1.  elementData 是"Object[]类型的数组",它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的大小,默认大小为10。随着Vector中元素的增加,Vector的容量也会动态增长,capacityIncrement是与容量增长相关的增长系数,具体的增长方式,下面的源码中将分析ensureCapacity()函数。
  2.  capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时,增加的大小都是capacityIncrement。

看一下两个最主要的构造函数:

[java] view plain copy print?
  1. // capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。  
  2. public Vector(int initialCapacity, int capacityIncrement) {  
  3.     super();  
  4.     if (initialCapacity < 0)  
  5.         throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);  
  6.     this.elementData = new Object[initialCapacity];  
  7.     this.capacityIncrement = capacityIncrement;  
  8. }  
  9. // 创建一个包含collection元素的Vector  
  10. public Vector(Collection<? extends E> c) {  
  11.     elementData = c.toArray();  
  12.     elementCount = elementData.length;  
  13.     // c.toArray might (incorrectly) not return Object[] (see 6260652)  
  14.     if (elementData.getClass() != Object[].class)  
  15.         elementData = Arrays.copyOf(elementData, elementCount, Object[].class);  
  16. }  

看一下动态扩容的相关函数源代码实现:

[java] view plain copy print?
  1. private void ensureCapacityHelper(int minCapacity) {  
  2.      if (minCapacity - elementData.length > 0)  
  3.          grow(minCapacity);  
  4.  }  
  5.    
  6.  private void grow(int minCapacity) {  
  7.   
  8.      int oldCapacity = elementData.length;  
  9.      int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);  
  10.      if (newCapacity - minCapacity < 0)  
  11.          newCapacity = minCapacity;  
  12.      if (newCapacity - MAX_ARRAY_SIZE > 0)  
  13.          newCapacity = hugeCapacity(minCapacity);  
  14.      elementData = Arrays.copyOf(elementData, newCapacity);  
  15.  }  
在进行动态扩容时,Vector的新容量大小为原有容量加上capacityIncrement,如果这个数不大于0,则扩容为原始容量的2倍。


下面为总结一下ArrayList和Vector的区别:

  1. ArrayList在内存不中时扩容的策略为50% + 1个,Vector在capacityIncrement大于0时扩容capacityIncrement大小,否则为原始容量(oldCapacity)的2倍。
  2. Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。Vector这种安全也是相对的,为什么这么说呢?请看下面的例子:


[java] view plain copy print?
  1. public class VectorTest {  
  2.    
  3.     private static Vector v = new Vector();  
  4.    
  5.     public static void readAll() {  
  6.         int size = v.size();  
  7.         for (int i = 0; i < size; i++) {  
  8.             v.get(i);  
  9.         }  
  10.     }  
  11.    
  12.     public static void deleteAll() {  
  13.         if (v.iterator().hasNext()) {  
  14.             v.remove(0);  
  15.         }  
  16.     }  
  17. }  

如上的程序在执行的过程中就有可能招出ArrayIndexOutOfBoundException异常。



2、Stack


Stack是栈。它的特性是:先进后出(FILO, First In Last Out)。Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的。其类的源代码如下:

[java] view plain copy print?
  1. public class Stack<E> extends Vector<E> {  
  2.     public Stack() {    }  
  3.     public E push(E item) {       // 压栈  
  4.         addElement(item);  
  5.   
  6.         return item;  
  7.     }  
  8.   
  9.     public synchronized E pop() { // 弹栈  
  10.         E   obj;  
  11.         int  len = size();  
  12.         obj = peek();  
  13.         removeElementAt(len - 1);  
  14.   
  15.         return obj;  
  16.     }  
  17.   
  18.     public synchronized E peek() { // 返回栈顶元素  
  19.         int  len = size();  
  20.         if (len == 0)  
  21.             throw new EmptyStackException();  
  22.         return elementAt(len - 1);  
  23.     }  
  24.   
  25.     public boolean empty() {      // 判断栈是否为空  
  26.         return size() == 0;  
  27.     }  
  28.   
  29.     public synchronized int search(Object o) {  // 查找元素  
  30.         int i = lastIndexOf(o);  
  31.         if (i >= 0) {  
  32.             return size() - i;  
  33.         }  
  34.         return -1;  
  35.     }  
  36.