0.结构图
1.Vector是什么
可以简单的认为Vector是一个动态数组;Vector是通过数组实现的,长度不够是,调用Arrays.copyOf方法,拷贝当前数组到一个新的长度更大的数组中。
2.Vector的特点
vector和ArrayList极其相似,所以很多时候都会被对比异同。
相同点:
1)都继承了AbstractList抽象类,实现了List接口,源头都是collection接口。
2)随机访问快,插入和删除性能较差,支出null元素,有顺序(因为有序,所以能通过索引下标来查找元素,故随机访问快),元素可重复。
不同点:
- 同步性:
1)Vector线程安全,ArrayList线程不安全。
2)Vector中涉及到线程安全的方法都带有synchronize关键字,是线程安全的,而ArrayList的方法没有synchronize关键字,是线程不安全的。
- 效率:
1)Vector涉及到方法间的线程同步,效率低。
2)ArrayList不用考虑线程安全,效率高。
如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。(鉴于Vector的线程安全功能已经被其他方式代替,多线程访问集合时首先考虑的已经不是使用vector了)。
- 扩容机制:
1)vector扩容的时候是直接扩展了一倍,而ArrayList是扩展50%。
2)ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来一倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。
3.Vector内部数组扩容
Vector使用了三种构造方法
public vector()
public vector(int initialcapacity,int capacityIncrement)
public vector(int initialcapacity)
使用第一种方法系统会自动对向量进行管理,若使用后两种方法,则系统将根据参数,initialcapacity设定向量对象的容量(即向量对象可存储数据的大小),当真正存放的数据个数超过容量时。系统会扩充向量对象存储容量。
参数capacityincrement给定了每次扩充的扩充值。当capacityincrement为0的时候,则每次扩充一倍,利用这个功能可以优化存储。
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity