概要
类继承关系
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractList<E>
java.util.Vector<E>定义
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
}
实现
Vector是从JDK1.2就已提供的List实现,与ArrayList一样,也是基于Object数组的方式来实现的。
- 创建
默认创建大小为10的Object数组,并将capacityIncrement设置为0。
public Vector() { this(10);}
public Vector(int initialCapacity) { this(initialCapacity, 0);}
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
- 添加元素 add(E)
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
add方法加了synchronized关键字,因此,此方法是线程安全的。
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
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);}
Vector扩大数组的方式与ArrayList不同,若capacityIncrement > 0, 则数组大小扩大为现有size加上capacityIncrement,若capacityIncrement < 0, 则扩大为现有size的两倍。这种容量控制策略比ArrayList更为可控。
- 删除 remove(Object)
除其调用的removeElement方法上有synchronized关键字外,和ArrayList完全相同。
- 获取 get(int)
除该方法上有synchronized关键字外,和ArrayList完全相同。
注:
- Vector 是基于 Synchronized 实现的线程安全的 ArrayList, 但在插入元素时容量扩充与ArrayList不同,可通过传入capacityIncrement来控制容量的扩充。