1、关于Vector集合,底层是一个对象数组,Vector类是线程同步的,因此线程安全,在一些关于集合的增删改查的方法上添加有synchronized,因此在开发中,涉及到多线程时,可以考虑使用Vector集合
2、关于Vector扩容的步骤如下
//Vector 源码解读
public class VectorDemo {
public static void main(String[] args) {
List vector = new Vector<>();
for (int i = 1; i <= 10; i++) {
vector.add(i);
}
vector.add(11);
System.out.println(vector);
}
}
在创建Vector对象处打上断点,开始进行测试,首先测试无参构造方法
此时调用下面的构造方法
然后继续调用构造方法
在该构造方法中elementData将会被初始化为容量为10的数组,
然后设置capacityIncrement = 0
然后进入add()方法
进入add()方法前依旧将基本数据类型进行装箱
add()方法
modCount参数表示修饰修改集合的次数
然后调用 ensureCapacityHelper(elementCount + 1) 此时的elementCount初始值为0,类似ArrayList中的size属性。
进入 ensureCapacityHelper()
mincapacity = 1,然后elementData.length = 10(因为创建对象时,已经初始化了)
显然if(1-10 > 0) 显然条件不成立,因此不会进行扩容。
然后当容量为10时,进行扩容的步骤如下
依旧是这个方法,但是此时需要的容量为11了,即是minCapacity = 11。
然后条件成立,进行扩容grow()方法
oldCapacity = 10,capacityIncrement = 0,因此三元表达式取后面的值,即是2倍原来的容量,因此从这点就可以看出来,Vector的扩容机制几乎和ArrayList一致,但是扩容的大小不相同。最后通过Arrays.copyOf()方法进行数组扩容。grow()执行完毕,最后返回add()进行元素赋值
打完收工
测试有参构造方法
public class VectorDemo1 {
public static void main(String[] args) {
List vector = new Vector<>(8);
for (int i = 1; i <= 10; i++) {
vector.add(i);
}
System.out.println(vector);
}
}
设置初始值为8,然后进行debug调试
继续调用两个参数的构造方法
此时就会创建一个容量为8的数组元素赋值给elementData,然后capacityIncrement依旧为0
后面依旧是熟悉的配方
进入ensureCapacityHelper()方法
此时minCapacity =0,但是element.length = 8,if()条件不成立,依然不扩容
然后当所需的最小容量为9时,进入grow()方法即进行扩容
此时条件成立,进入grow()方法进行扩容,与上面一样的配方,都是扩容为原来的两倍



