1. 什么是Vector
1. Vector是早期的动态数组集合(jdk1.0),在单线程下是线程安全的(synchronized)
2. Vector初始化时源码的变化
1. 初始化Vector
List<String> list1 = new Vector<>();
List<String> list2 = new Vector<>(50,0);
2. 对应的源码
public Vector() { this(10); }//capacityIncrement是扩容的大小默认是0(意思是按照2倍来扩容),如果传入其他正整数就是在原有的基础上+正整数来进行扩容。如传入5,那么触发扩容时就是 原有容量 + 5
public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; }分析:如果是无参的构造方法那么初始容器的长度为10;如果规定了长度那么就创建对应长度的容器,如果来传入了扩容系数那么在扩容时就增加对应系数的容量
3. Vector添加元素时源码的变化
1. 添加元素
list1.add("one");
2. 对应源码
//1. 获取参数“one”
public synchronized boolean add(E e) {//2. 记录修改次数modCount++;//3. elementCount:元素数量(默认是0)ensureCapacityHelper(elementCount + 1);//6. 在位置0写入元素“one”,并且元素数量++elementData[elementCount++] = e; return true; }//4.拿到minCapacity(最小容量):1
private void ensureCapacityHelper(int minCapacity) { // overflow-conscious code//5. 1-10(Vecotor默认数组长度),所以暂时不执行grow()if (minCapacity - elementData.length > 0)//7. 当元素数量达到扩容时执行,minCapacity==10grow(minCapacity); }//8. 传入最小容量 10
private void grow(int minCapacity) { // overflow-conscious code//9. 记录老的容量 10int oldCapacity = elementData.length;//10. 新的容量 = 10+10(在capacityIncrement < 0时,也即按照默认的扩容;如果是capacityIncrement > 0,说明传入了扩容数量那么 新的容量 = 10 + capacityIncrement)int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);//11. 20-10=10 不成立不执行;如果capacityIncrement是负数会触发if (newCapacity - minCapacity < 0) newCapacity = minCapacity;//12. 一般不会添加21亿个数据,当然如果真的发生了那我也不知道该怎么办if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity);//13. 按照新的容量来创建新的数组并把内容写入,把引用指向新的对象elementData = Arrays.copyOf(elementData, newCapacity); }
4.总结
1. Vector是线程安全的容器(单线程环境下),性能不如araayLsit(因为Vector加锁)
2.Vector的默认扩容是2倍,也可以自定义扩容,而ArrayList是1.5倍