Vector 源码解析:为什么它被 ArrayList 取代了?

Vector 源码解析:为什么它被 ArrayList 取代了? 1. 什么是Vector1. Vector是早期的动态数组集合(jdk1.0),在单线程下是线程安全的(synchronized2. Vector初始化时源码的变化1. 初始化VectorListString list1 new Vector();ListString list2 new Vector(50,0);2. 对应的源码public Vector() { this(10); }//capacityIncrement是扩容的大小默认是0(意思是按照2倍来扩容),如果传入其他正整数就是在原有的基础上正整数来进行扩容。如传入5那么触发扩容时就是 原有容量 5public 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(最小容量):1private void ensureCapacityHelper(int minCapacity) { // overflow-conscious code//5. 1-10(Vecotor默认数组长度),所以暂时不执行grow()if (minCapacity - elementData.length 0)//7. 当元素数量达到扩容时执行minCapacity10grow(minCapacity); }//8. 传入最小容量 10private void grow(int minCapacity) { // overflow-conscious code//9. 记录老的容量 10int oldCapacity elementData.length;//10. 新的容量 1010(在capacityIncrement 0时也即按照默认的扩容;如果是capacityIncrement 0,说明传入了扩容数量那么 新的容量 10 capacityIncrementint newCapacity oldCapacity ((capacityIncrement 0) ? capacityIncrement : oldCapacity);//11. 20-1010 不成立不执行如果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倍