走进源码——Vector阅读笔记

作者: l_sivan | 来源:发表于2017-06-22 18:15 被阅读58次

    Vector

    继承自AbstractList,实现了List,RandomAccess,Cloneable,和Serializable接口,具有List的特性,提供可随机访问,提供自身克隆以及序列化的一个容器类。
    特点:线程安全;数组实现

    Vector的实现和ArrayList没什么区别,这里就不列成员变量和一些共有的方法了,有兴趣可以去看走进源码——ArrayList阅读笔记,这篇主要讲Vector和ArrayList的区别

    • 区别一:线程安全
      在ArrayList中,所有的方法都是线程不安全的,在多线程环境下很容易出问题,而Vector就不一样了,Vector在涉及到操作容器数据的方法上,都加上了synchronized关键字,甚至是迭代器的获取上也加上了这个关键字,我们可以感受下

      带synchronized关键字的获取迭代器的方法
      带synchronized关键字的remove的方法
      但是,凡事有利弊,这种线程绝对安全的保证的一个最明显的负面效应就是性能的损耗,特别是很多线程同时操作同一个Vector对象时,那么将会有很多很多线程被阻塞,是很不利于系统性能的。
    • 区别二:初始化
      相对于ArrayList中的初始化,Vector的其中一个初始化函数多了一个

    protected int capacityIncrement;
    

    形参,这个形参如其名,容量增长,取好听点,我们叫容量增长因子。

    public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
    throw new IllegalArgumentException("Illegal Capacity: "+
    initialCapacity);
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
    }
    类似于ArrayList的带initialCapacity形参的构造函数,区别就在于初始化自身的capacityIncrement属性而已,其次还有下面两个
    public Vector(int initialCapacity) {
    this(initialCapacity, 0);
    }
    public Vector() {
    this(10);
    }
    

    这里吐槽下this(10);,在ArrayList那里起码还有一个DEFAULT_CAPACITY,在Vector这里直接就是10....是懒了吗...Vector的默认初始化就是容量为10,容量增长因子为0

    • 区别三:容量增长
      在ArrayList中容量是1.5倍增加的,可能Vector的设计者觉得这个1.5太可怕了(特别在数量级达到万之后的单位),所以才在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);
    }
    

    很明显,如果在初始化的时候传入了capacityIncrement,那么,vector的每次容量的增长都是以capacityIncrement为单位进行增长的,所以就没有了ArrayList中直接增大1.5倍的爆炸增长速率

    其余的实现和ArrayList都是大同小异,这里就不在撰述了

    水平有限,难免有错,还请评论区指正

    相关文章

      网友评论

        本文标题:走进源码——Vector阅读笔记

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