Vector
Vector很多方法都和ArrayList一样,只是多加了synchronized保证了线程的安全。
Vector比ArrayList多了一个属性
protected int capacityIncrement;
这个属性是在扩容的时候用到的,表示每次扩容只扩容capacityIncrement个空间,该属性可以通过构造方法赋值。
构造方法
public Vector(int initialCapacity, int capacityIncrement)
{
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacit
y: "+initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector() {
this(10);
}
从构造方法中,我们可以看出 Vector 的默认大小也是 10,而且它在初始化的时候就已经创建了数组了,这点跟 ArrayList 不一样。
grow方法
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);
}
从 grow 方法中我们可以发现,newCapacity 默认情况下是两倍的 oldCapacity,而当指定了 capacityIncrement 的值之后,newCapacity 变成了oldCapacity+capacityIncrement。
总结
1、Vector创建时默认大小为10
2、Vector每次扩容但都是以当前数组的2倍扩容,当指定了capacityIncrement后,每次扩容仅在原有基础上增加capacityIncrement个空间。
3、Vector和ArrayList的add、get、size方法时间复杂度都为 O(1),remove方法的时间复杂度为O(n)
4、ArrayList是线程不安全的,Vector是线程安全的。