1.什么是Vector
- 矢量队列,作用等效于
ArrayList,线程安全
- 官方不推荐使用该类,非线程安全推荐
ArrayList,线程安全推荐 CopyOnWriteList
- 区别于
ArrayList,几乎所有public方法全部由 syncronized修饰,因此线程安全
- 由于该类跟
ArrayList代码基本一致(后者是前者的非同步代替类),因此仅仅只解析部分有差异的方法
- 队列详情解析请参见笔者的 ArrayList一文通
2.Vector的数据结构
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- 继承
AbstractList,实现了 List,它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能
- 实现
RandmoAccess 接口,实现快速随机访问:通过元素的序号快速获取元素对象
- 实现
Cloneable 接口,重写 clone(),能被克隆(浅拷贝)
- 实现
java.io.Serializable 接口,支持序列化
/** * The array buffer into which the components of the vector are stored. * The capacity of the vector is the length of this array buffer, * and is at least large enough to contain all the vector's elements. * 底层数据结构为动态数组 * <p>Any array elements following the last element in the Vector are null. * @serial */protected Object[] elementData;/** * The number of valid components in this {@code Vector} object. * Components {@code elementData[0]} through * {@code elementData[elementCount-1]} are the actual items. * 数组长度 == 数组的length == ArrayList的size() * @serial */protected int elementCount;/** * The amount by which the capacity of the vector is automatically * incremented when its size becomes greater than its capacity. If * the capacity increment is less than or equal to zero, the capacity * of the vector is doubled each time it needs to grow. * 当容量不够时,每次Vector容量增加时的增量值;若该值<=0,则默认自动扩容两倍 * @serial */protected int capacityIncrement;
/** * Constructs an empty vector with the specified initial capacity and * capacity increment. * 创建一个指定容量和容量增量值的Vector * @param initialCapacity the initial capacity of the vector * @param capacityIncrement the amount by which the capacity is * increased when the vector overflows * @throws IllegalArgumentException if the specified initial capacity * is negative */public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement;}/** * Constructs an empty vector with the specified initial capacity and * with its capacity increment equal to zero. * 创建一个指定容量的Vector,容量不够时自动扩容两倍 * @param initialCapacity the initial capacity of the vector * @throws IllegalArgumentException if the specified initial capacity * is negative */public Vector(int initialCapacity) { this(initialCapacity, 0);}/** * Constructs an empty vector so that its internal data array has size {@code 10} * and its standard capacity increment is zero. * 默认构造器,初始容量为10(跟ArrayList一样),容量不够时自动扩容两倍 */public Vector() { this(10);}/** * Constructs a vector containing the elements of the specified collection, * in the order they are returned by the collection's iterator. * 创建一个包含collection的Vector * @param c the collection whose elements are to be placed into this vector * @throws NullPointerException if the specified collection is null * @since 1.2 */public Vector(Collection<? extends E> c) { elementData = c.toArray(); elementCount = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, elementCount, Object[].class);}
3.Vector的方法解析
/** * 数组自动扩容 * 区别于ArrayList 的 (int)Math.floor(oldCapacity*1.5) * Vector的扩容方案为: * 当增值量 > 0 时,新容量=原容量+增值量 * 当增值量 <=0 时,新容量=原容量*2(但采用的是加法而非更高效的位运算) */ private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; //重点差异 int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity);}
/** * Save the state of the {@code Vector} instance to a stream (that is, serialize it). * This method performs synchronization to ensure the consistency of the serialized data. * 比较有意思的是虽然Vector支持序列化,但并没有像ArrayList支持提供 writeObject() 和 readObject() * 来分别支持 序列化和反序列化 的方法级别的直接支持, 唯一的 序列化方法竟然只是private级别。 * 因此想实现Vector的序列化和反序列化功能必须通过手动通过 ObjectOutputStream实现 */private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { final java.io.ObjectOutputStream.PutField fields = s.putFields(); final Object[] data; //该方法使用同步代码块(synchronized的推荐使用方法) -- 具体请期待笔者的`并发包系列` synchronized (this) { fields.put("capacityIncrement", capacityIncrement); fields.put("elementCount", elementCount); data = elementData.clone(); } fields.put("elementData", data); s.writeFields();}