Vector与ArrayList的关系

Vector与ArrayList底层都是基于可变数组来实现的

Vector是线程安全的 ,ArrayList是不安全的(Vector的操作方法上都加了锁)

数组长度需增长时,Vector默认增长一倍,ArrayList增长50% 我的上一篇博客中已经跟了ArrayList.add()方法源码

Vector.add()源码

我们来跟跟Vector中的add()方法的底层源码,看它是如何实现数组动态扩容的。

当我们创建Vector对象的时候默认构造方法会帮我们完成一系列创建数组初始化:

构造方法

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]; //创建长度为10的数组
    this.capacityIncrement = capacityIncrement;     //用于扩容数组的判断变量
}

从上面的代码我们可以看出Vector在执行构造方法的时候就定义长度为10的数组跟ArrayList是有区别的 ArrayList构造方法执行的时候只赋值为空数组,只有第一次add()值的时候才会将数组扩容为10

添加元素方法

public synchronized boolean add(E e) {      //synchronize 上锁 方法同步
    modCount++;
    ensureCapacityHelper(elementCount + 1); //计算是否需要扩容
    elementData[elementCount++] = e;        //赋值
    return true;
}

如上代码我们可以看出除了加锁之外与ArrayList.add()方法基本一致。我们再来看扩容操作

private void ensureCapacityHelper(int minCapacity) {
    if (minCapacity - elementData.length > 0)//增加之后的元素总个数是否大于数组长度
        grow(minCapacity);  //扩容操作
}

扩容操作比ArrayList中的扩容代码简单多了,直接判断增加元素之后的所有元素的个数是否大于数组的长度,如果大于就进行扩容操作。

这里我们以第一次扩容为例 也就是存入第十一个值时进行的扩容操作

private void grow(int minCapacity) {
    int oldCapacity = elementData.length;   //原始数组的长度10

    //capacityIncrement 从一开始创建没有进行过操作则为0  则 capacityIncrement > 0 不成立
    //则 新数组长度newCapacity =旧数组长度oldCapacity +旧长度oldCapacity=20 也就增长了一倍
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);

    if (newCapacity - minCapacity < 0) // 20-11 < 0 不成立
        newCapacity = minCapacity; 
    if (newCapacity - MAX_ARRAY_SIZE > 0) //20>MAX_ARRAY_SIZE  不成立
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity); //将数组变为长度为newCapacity20的数组
}

Vector.add()方法跟踪完毕。

通过如上代码我们可以看出Vector动态扩容数组的时候每次扩容为原来的二倍。ok完事大吉!!!