查看 Vector
源码
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Vector
实现了 List
接口
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
// 底层为数组,数组类型为Object
protected Object[] elementData;
// 数组中的有效数据长度
protected int elementCount;
protected int capacityIncrement;
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);
// 给底层数组长度为10
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
// 添加元素方法 线程安全synchronized
public synchronized boolean add(E e) {
modCount++;
// 相当于ensureCapacityHelper(11)
ensureCapacityHelper(elementCount + 1);
// 最开始elementCount为0,添加元素后elementCount+1操作
elementData[elementCount++] = e;
return true;
}
// minCapacity = 11
private void ensureCapacityHelper(int minCapacity) {
// 如果(11-10 > 0) 进行grow方法
if (minCapacity - elementData.length > 0)
// minCapacity = 11
grow(minCapacity);
}
// minCapacity = 11
private void grow(int minCapacity) {
// oldCapacity = 10
int oldCapacity = elementData.length;
// 这里与arraylist有所不同,不是原数组的1.5倍扩容
// 底层数组扩容为2倍 newCapacity = 10 + 10
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 = Arrays.copyOf(elementData, newCapacity);
}
}
联系:底层都是数组的扩容
区别:ArrayList 底层扩容长度为原数组的1.5倍 线程不安全 效率高
Vecotr 底层扩容长度为原数组的2倍 线程安全 效率低(淘汰)