【Java集合源码剖析1.3】Vector源码剖析(API23)

Vector共有4个构造函数
// 默认构造函数
Vector()

// capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。
Vector(int capacity)

// capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
Vector(int capacity, int capacityIncrement)

// 创建一个包含collection的Vector
Vector(Collection collection)

先看一下Vector的add()方法 :

    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

很容易理解, 直接 在elementCount+1个位置插入这个对象。
指定位置插入对象:

    public synchronized void insertElementAt(E obj, int index) {
        modCount++;
        if (index > elementCount) {
            throw new ArrayIndexOutOfBoundsException(index
                                                     + " > " + elementCount);
        }
        ensureCapacityHelper(elementCount + 1);
        System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
        elementData[index] = obj;
        elementCount++;
    }

和ArrayList的处理方法是一样的。将第index个位置往后移一个单位,然后在第index位置插入对象 。

 public synchronized boolean addAll(Collection c) {
        modCount++;                                   //统计修改次数累加。
        Object[] a = c.toArray();                       // 集合转为数组 
        int numNew = a.length;                       // 要添加集合里对象的个数 。 
        ensureCapacityHelper(elementCount + numNew);          //扩容
        System.arraycopy(a, 0, elementData, elementCount, numNew);     //追加集合。
        elementCount += numNew;
        return numNew != 0;
    }

看一下移除的方法 。

   public synchronized void removeElementAt(int index) {
        modCount++;
        if (index >= elementCount) {               //  越界检查
            throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                     elementCount);
        }
        else if (index < 0) {
            throw new ArrayIndexOutOfBoundsException(index);
        }
        int j = elementCount - index - 1;
        if (j > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, j);   //从Index 开始,前移一个单位 。 
        }
        elementCount--;
        elementData[elementCount] = null;     // 回收。 
    }

其它可以自行分析吧,比较简单 ,
小结:
1.Vector实现了List, RandomAccess, Cloneable, java.io.Serializable接口。
2.Vector也同样采用了数组的储存方式,这一点和ArrayList是一样的。
3.Vector与ArrayList不同的是,所有方法都加上了synchronized同步关键词, 所以Vector是线程安全的,不过也一般比较少用, 一般都采用线程安全的CopyOnWriteArrayList。

你可能感兴趣的:(【Java集合源码剖析1.3】Vector源码剖析(API23))