Vector源码分析

Vector源码分析

结论

  1. 无参构造,默认长度为10,满后按2倍扩容
  2. 指定大小,需要扩容时,每次按两倍扩容

源码分析

和ArrayList类似

无参构造时

无参构造器

public Vector() {
    // 按照10个空间大小调用带参构造器
    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];
    	// 将capacityIncrement赋值好
        this.capacityIncrement = capacityIncrement;
    }

add()方法

public synchronized boolean add(E e) {
    	// 修改次数++
        modCount++;
    	// 扩容
        ensureCapacityHelper(elementCount + 1);
    	// 添加数据
        elementData[elementCount++] = e;
    	// 返回true
        return true;
    }

扩容

private void ensureCapacityHelper(int minCapacity) {
    // overflow-conscious code
    // 判断,在容量不够用时扩容
    if (minCapacity - elementData.length > 0)
        // 容量不够时调用
        grow(minCapacity);
}

private void grow(int minCapacity) {
  
        int oldCapacity = elementData.length; 
    	// (capacityIncrement > 0) ? capacityIncrement : oldCapacity说明
    	// 当capacityIncrement > 0时按自定义构造器的第二个参数的capacityIncrement来
    	// 此时newCapacity按elementData.length+自定义长度来
    
    	// 当capacityIncrement > 0不成立按oldCapacity也就是elementData.length
    	// 此时newCapacity为2*elementData.length
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
    	// 判断大小,将newCapacity和minCapacity中最大值赋给newCapabcity
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
    	// 如果超出最大值
    	// 一般不会
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            // 超出的话,调用hugeCapacity()
            newCapacity = hugeCapacity(minCapacity);
    
    	// 利用拷贝对elementData进行扩容
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
posted @ 2022-02-23 13:50  CoderCatIce  阅读(45)  评论(0编辑  收藏  举报