美文网首页
【Java集合源码剖析1.3】Vector源码剖析(API23)

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

作者: MrLuo | 来源:发表于2017-07-31 14:43 被阅读11次
    Vector共有4个构造函数
    // 默认构造函数
    Vector()
    
    // capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。
    Vector(int capacity)
    
    // capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
    Vector(int capacity, int capacityIncrement)
    
    // 创建一个包含collection的Vector
    Vector(Collection<? extends E> 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<? extends E> 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<E>, RandomAccess, Cloneable, java.io.Serializable接口。
    2.Vector也同样采用了数组的储存方式,这一点和ArrayList是一样的。
    3.Vector与ArrayList不同的是,所有方法都加上了synchronized同步关键词, 所以Vector是线程安全的,不过也一般比较少用, 一般都采用线程安全的CopyOnWriteArrayList。

    相关文章

      网友评论

          本文标题:【Java集合源码剖析1.3】Vector源码剖析(API23)

          本文链接:https://www.haomeiwen.com/subject/fwgllxtx.html