最常用的容器
首先是vector类的继承关系如下图
Vector和ArrayList很相似,都是内部维护了一个可以变换长度的数组,但他们的扩容机制不同。
1.构造函数
public Vector() {
this(10);//容量为 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;
}
// 此方法在 JDK 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);
}
Vector的构造函数可以指定内部数组的初始容量和扩容系数,如果不指定初始容量默认初始容量为10,不同于ArrayList的是它在创建时就分配了容量为10的数组,但是ArrayList在第一次调用add时才生成一个容量为10数组。
2.扩容机制
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// 如果我们没有指定扩容系数,那么 newCapacity = 2 * oldCapacity
// 如果我们指定了扩容系数,那么每次增加指定的容量
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在扩容的时候,首先判断capacityIncrement,如果指定了这个,就按照这个指定的系数扩大容量,扩大后容量为oldCapacity+capacityIncrement,如果没有指定就默认扩大到原来一倍。
Vector与ArrayList一个重要区别就是Vector所有访问内部数组的方法都带有Synchronized,这意味着Vecotr是线程安全的,而ArrayList没有这样的特性。