Vector与ArrayList的关系
Vector与ArrayList底层都是基于可变数组来实现的
Vector是线程安全的 ,ArrayList是不安全的(Vector的操作方法上都加了锁)
数组长度需增长时,Vector默认增长一倍,ArrayList增长50% 我的上一篇博客中已经跟了ArrayList.add()方法源码https://blog.csdn.net/qq_34357351/article/details/103519979
Vector.add()源码
我们来跟跟Vector中的add()方法的底层源码,看它是如何实现数组动态扩容的。
当我们创建Vector对象的时候默认构造方法会帮我们完成一系列创建数组初始化:
构造方法
public Vector() {
this(10); //调用有参构造方法 定义初始数组长度为10
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);//继续调用
}
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
this.elementData = new Object[initialCapacity]; //创建长度为10的数组
this.capacityIncrement = capacityIncrement; //用于扩容数组的判断变量
}
从上面的代码我们可以看出Vector在执行构造方法的时候就定义长度为10的数组跟ArrayList是有区别的 ArrayList构造方法执行的时候只赋值为空数组,只有第一次add()值的时候才会将数组扩容为10
添加元素方法
public synchronized boolean add(E e) { //synchronize 上锁 方法同步
modCount++;
ensureCapacityHelper(elementCount + 1); //计算是否需要扩容
elementData[elementCount++] = e; //赋值
return true;
}
如上代码我们可以看出除了加锁之外与ArrayList.add()方法基本一致。我们再来看扩容操作
private void ensureCapacityHelper(int minCapacity) {
if (minCapacity - elementData.length > 0)//增加之后的元素总个数是否大于数组长度
grow(minCapacity); //扩容操作
}
扩容操作比ArrayList中的扩容代码简单多了,直接判断增加元素之后的所有元素的个数是否大于数组的长度,如果大于就进行扩容操作。
这里我们以第一次扩容为例 也就是存入第十一个值时进行的扩容操作
private void grow(int minCapacity) {
int oldCapacity = elementData.length; //原始数组的长度10
//capacityIncrement 从一开始创建没有进行过操作则为0 则 capacityIncrement > 0 不成立
//则 新数组长度newCapacity =旧数组长度oldCapacity +旧长度oldCapacity=20 也就增长了一倍
int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0) // 20-11 < 0 不成立
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0) //20>MAX_ARRAY_SIZE 不成立
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity); //将数组变为长度为newCapacity20的数组
}
Vector.add()方法跟踪完毕。
通过如上代码我们可以看出Vector动态扩容数组的时候每次扩容为原来的二倍。ok完事大吉!!!