概述
之前已经学习过了ArrayList和LinkedList,也学习过了fail-fast机制。今天我们接着学习Collection框架中的另一个重要成员Vector。大概还是分为下面几个部分:
- Vector简介
- Vector的数据结构
- Vector源码解析(基于JDK1.8)
- Vector的遍历方式
Vector简介
|
|
Vector是矢量队列,继承于AbstractList,实现了List、RandomAccess、Cloneable和java.io.Serializable。
- Vector继承了AbstractList,实现了List,所以它是一个队列,支持相关CRUD和遍历等的功能;
- Vector实现了RandomAccess,说明它提供了随机访问的功能。RandomAccess是java中用来被List发现,为List提供快速访问功能的。在vector中,我们即可以通过元素的索引值来快速获取元素,这就是快速随机访问;
- Vector实现了Cloneable,说明它实现了clone()方法,能被克隆;
- Vector实现了java.io.Serializable,说明它能够被序列化;
和ArrayList不同的是,Vector是同步的,所以它的操作是线程安全的。
Vector的构造方法
|
|
Vector的API
|
|
数据结构分析
Vector的继承关系
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractList<E>
java.util.Vector<E>
Vector与Collection的关系
Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData(对应ArrayList的elementDate), elementCount(对应ArrayList的size), capacityIncrement(ArrayList没有).
- elementDate 是Object[]类型的数组,它保存了保存到Vector的元素.elementData是一个动态数组,如果初始化Vector的时候没有指定动态数组的容量,则使用默认容量10.随着Vector中元素的增加,Vector的容量也会随着增长, capacityIncrement是与增长相关的增长系数,具体的增长方式,可查看源码中的ensureCapacity方法.
- elementCount是动态数组的实际大小.
- capacityIncrement是动态数组的增长系数.如果在创建Vector指定了capacityIncrement,那么每次vector增长的时候,增加的大小都是capacityIncrement;如果创建的时候没有指定,则为容量double.1int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
Vector的源码分析(基于JDK 1.8.0_73)
源码分析
|
|
总结
- Vector实际上是通过一个数组去保存数据的.当我们使用默认构造器去构造Vector的时候,Vector的默认容量是10;
- 当Vector容量不足以容纳全部元素时,Vector会自动扩容.若增长系数>0, 则将容量增加增长系数的数值, 否则容量double.
- Vector的克隆方法,是把所有的元素克隆到一个数组中.
- Vector之所以是线程安全,是因为它的方法都用了synchronized修饰,是同步的.
Vector的遍历
第一种:随机遍历
|
|
第二种:迭代器遍历
|
|
第三种:forEach遍历
|
|
第四种:Enumeration遍历
|
|
测试效率的代码如下:
结果:
结论:
- 遍历Vector的时候,使用随机访问的效率最高,使用迭代器的效率最低;
- 使用随机访问的时候,如果在for语句里面用了
i < vector.size()
每次都获取size,那么随机访问的效率会变到最低;