前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、Vector

使用了大量的synchronized来保证安全性

1.1、类结构

1588745786629

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{

1.1、无参构造器

直接就初始化了数组的大小为10,而ArrayList如果是无参构造器初始化是在扩容的时候

public Vector() {
    this(10);
}

1.2、指定大小的构造器

public Vector(int initialCapacity) {
    this(initialCapacity, 0);
}

1.3、指定大小和每次扩容相加的长度

public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
}

1.4、add(E e)和grow扩容

1.4.1、add

使用synchronized,来保证安全性

public synchronized boolean add(E e) {
    modCount++;

    //确保elementData数组有合适的大小,当容量不够时进行扩容,,表示需要size + 1个空间容量
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
}
//确保elementData数组有合适的大小,当容量不够时进行扩容,,表示需要size + 1个空间容量
private void ensureCapacityHelper(int minCapacity) {

    //容量不够用了,要扩容 (同时包含初始化数组,空数组的时候elementData.length == 0,)
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

1.4.2、grow

如果我们指定了扩容累加的长度,则使用累加的长度,否则等于旧的容量乘以2

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    //如果我们指定了扩容累加的长度,则使用累加的长度,否则等于旧的容量乘以2 
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity);
    //最少需要的容量比 新计算出来的容量还要打。)我们这个时候要使用期望的最小容量作为新的容量
    //情况1:无参构造器,数组初始化,
    //情况2:指定容量为1
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    
        //如果通过上面计算出来的容量,比数组允许的最大容量还要大,那肯定不行的。所以要根据实际需要的最小容量来减少,调用hugeCapacity重新获取新的容量
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}
/**
 * 取得最大容量
 */
private static int hugeCapacity(int minCapacity) {
    //数组的长度已经超过Integer.MAX_VALUE ,再加1就会变成负数 溢出
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    //取最大容量 加入最少需要的容量比数组的最大容量还要大,Integer的最大值作为新的数组容量,否则就返回,数组最大容量
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
    MAX_ARRAY_SIZE;
}

1.5、remove(int index)

使用synchronized保证线程安全

1、检查索引位置是否越界

2、定位元素,放入新的元素,返回旧的元素。然后重新移动数组

public synchronized E remove(int index) {
    modCount++;
    if (index >= elementCount)
        throw new ArrayIndexOutOfBoundsException(index);
    E oldValue = elementData(index);

    int numMoved = elementCount - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--elementCount] = null; // Let gc do its work

    return oldValue;
}

ContactAuthor