JDK源码阅读——Vector实现

1 继承结构图

Vector同样继承自AbstractList,与ArrayList、LinedList一样,是List的一种实现

2 数据结构

    // 与ArrayList一样,也是使用对象数组保存元素
    protected Object[] elementData;

    // 记录元素的个数
    protected int elementCount;

    // 每次动态扩容时数组长度增长的长度,可在初始化的时候设置
    protected int capacityIncrement;

与ArrayList一样,Vector也是使用对象数组记录元素的值,记录数组长度使用elementCount,与ArrayList不一样的是,Vector每次数组扩容的长度可在初始化的时候设置,用变量capacityIncrement记录

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;
    }

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

    public Vector() {
        this(10);
    }

    public Vector(Collection<? extends E> c) {
        elementData = c.toArray();
        elementCount = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
    }

如上有四种构造方法,支持无参构造,设定初始长度构造、初始长度和扩容增长长度构造和传入一个Collection对象进行构造。

其余三种构造方法与ArrayList基本一样,只是与ArrayList不一样的是,Vector支持在构造的时候设定每次动态扩容数组长度增长的值,而ArrayList默认每次扩容都是在当前数组长度的基础上增加一般,具体实现如下:

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

而Vector如果在初始化的时候不设置这个值得话,每次扩容则在当前数组长度的基础上增加一倍,实现如下

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

4 需要注意的方法

Vector作为List的一种实现,由于其与ArrayList一样使用对象数组来保存元素,所以其提供的方法与ArrayList基本类似,但是所有方法的定义都多了一个关键字synchronized,相信大家已经知道Vector存在的意义了,那么就是Vector是线程安全的。这也是它与ArrayList的根本区别。

这也决定了ArrayList和Vector在使用上的区别。由于ArrayList不考虑线程安全,所以在执行效率上,ArrayList是优于Vector的,所以在不需要考虑线程安全,或者永远都只会有一个线程能访问到List对象时,最好使用ArrayList,而在可能会有多个线层访问同一个List集合时,使用Vector无疑是最佳选择,因为它的实现已经考虑了线程安全的问题。

猜你喜欢

转载自www.cnblogs.com/xiaocainiao2hao/p/10200745.html