如文章[1]所说,ArrayList和Vector的区别在于,一,ArrayList线程不安全,Vector线程安全。二,ArrayList扩容是变为原来的1.5倍,而Vector是2倍。
本文中要探究的就是扩容倍数这里的源码。
ArrayList和Vector,调用add方法时,都会调用一个grow方法,来确保数组的容量够用。两者扩容倍数的不同,仅在于grow方法的实现有所不同。
从图中可以看出,Vector扩容的代码为oldCapacity + oldCapacity ,也就是2倍的oldCapacity 。capacityIncrement初始化为0,且在调用add的过程中没有另行赋值。
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
而ArrayList的扩容代码为oldCapacity + oldCapacity /2,也就是1.5倍的oldCapacity 。
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
参考文献
[1],ArrayList和Vector的区别