我们从Java中的数据结构的角度去分析他们的区别;
Vector和ArrayList的数据结构类型均为一维数组,而且是长度可变的一维数组。
Vector:
①当我们用默认构造函数创建实例的时候:
②我们来看源码:
②当ArrayList中的数据元素超出默认长度10的时候,会调用grow()方法,看一下源码:
ArrayList容量增加的源码:
ArrayList与Vector的区别总结:
Vector vector = new Vector<String>();
从源码中可以看到:调用这个构造方法默认情况下创建的一组数据长度大小为10,刚才说了Vector是可变的一维数组,所以当Vector的存储容量超过10的时候会怎么呢?②我们来看源码:
public synchronized void ensureCapacity(int minimumCapacity) {
if (elementData.length < minimumCapacity) {
int next = (capacityIncrement <= 0 ? elementData.length
: capacityIncrement)
+ elementData.length;
grow(minimumCapacity > next ? minimumCapacity : next);
}
}
从上面的源码中我们可以看到,在Vector默认的一维数组满的时候如果我们没有指定数组增加的长度,默认情况下会增加elementData.length,也即是默认长度的一倍(即10)。
ArrayList:
①当我们用默认构造函数创建实例的时候:
ArrayList list = new ArrayList<String>();
在ArrayList的源码中我们看一下:public ArrayList() {
this(10);
}
看到了吧,也是和Vector一样默认创建的以为数组的长度也是10.②当ArrayList中的数据元素超出默认长度10的时候,会调用grow()方法,看一下源码:
ArrayList容量增加的源码:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
在源码中这句话 int
newCapacity = oldCapacity + (oldCapacity >> 1);表明ArrayList自增加的容量为默认容量的50%。ArrayList与Vector的区别总结:
相同点:
①存储数据结构都是一维数组。
③既然是数组就具备数组的特性:它们均适合随机查找和遍历,不适合插入和删除
②默认情况下创建的一维数组长度均为10。
不同点:
①作为可变数组,在默认情况下Vector增加的长度为原始长度的1倍,ArrayList为原始长度的50%,因此ArrayList更加灵活,节约空间。
②Vector是同步的,是线程安全的,ArrayList是线程不安全的。
③基于②,ArrayList操作(增加、删除、查询元素)的速度要优于Vector。