3-Vector底层结构和源码分析

介绍汇总:

  1. Vector的基本介绍
  2. Vector的运行重要步骤
  3. 底层结构和 ArrayList 的比较

1-Vector的基本介绍

  1. 定义说明

  1. Vector 底层也是一个对象数组,protected Object[] elementData ;
  2. Vector 是线程同步的,即线程安全,Vector 类的操作方法带有 synchronized 。
public synchronized E set(int index, E element) {
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
}
  1. 在开发中,需要线程同步安全是,考虑使用 Vector 。

2-Vector的运行重要步骤

  1. Vector 构造器(三种)

    无参构造器

    public Vector() {
            this(10);
    }
    
    // 此无参构造器会调用一参构造器,并且初始容量大小为 10 ,容量增量大小为 0
    

    一参构造器

    public Vector(int initialCapacity) {
            this(initialCapacity, 0);
    }
    
    // 此一参构造器会调用两参构造器,并且初始容量为指定大小,容量增量大小为 0
    

    两参构造器

    public Vector(int initialCapacity, int capacityIncrement) {
            super();
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
            this.elementData = new Object[initialCapacity];
            this.capacityIncrement = capacityIncrement;
    }
    
    // 此两参参构造器的初始容量为指定大小,容量增量也为指定大小
    

    总结

    ​ 从这三个构造器可以发现,核心是两参构造器,也是自由度最高的,可以指定初始容量,以及容量增量,这就代表之后扩容的话,以容量增量 + 原来的容量进行扩容(当然遇到这种方式无法满足扩容要求,就会采用其他方式,看源码);其次自由度最高的是一参构造器,可以指定初始容量,但容量增量为 0 ,这就代表之后扩容的话,以原来的容量的二倍进行扩容(当然遇到这种方式无法满足扩容要求,就会采用其他方式,看源码);然后自由度最低的,无参构造器,初始容量为默认容量 10 ,但容量增量为 0 ,其扩容方式与一餐构造器一致。

  2. 扩容过程

3- 底层结构和 ArrayList 的比较

集合 底层结构 版本 线程安全(同步)效率 扩容倍数
ArrayList 可变数组 jdk1.2 不安全,效率高 如果有参构造1.5倍如果无参初始化后第一次为10第二次开始按1.5倍
Vector 可变数组Object[] jdk1.0 安全,效率不高 若是无参或一参,按原本的容量的2倍扩;若是两参,按原本的容量 + 增加容量扩