1,Vector的概述
public class Vector
extends AbstractList
implements List, RandomAccess, Cloneable, Serializable
Vector,来自于JDK1.0 的古老集合类,继承自 AbstractList,实现了 List 接口 ,底层是数组结构,元素可重复,有序(存放顺序),支持下标索引访问,允许null元素。
该类当中所有方法的实现都是同步的,方法采用了synchronized修饰,数据安全,效率低!可以看成ArrayList的同步版本,但是并不完全相同,比如迭代器。
实现了 RandomAccess标志性接口,这意味着这个集合支持 快速随机访问 策略,那么使用传统for循环的方式遍历数据会优于用迭代器遍历数据,即使用get(index)方法获取数据相比于迭代器遍历更加快速!
还实现了Cloneable、Serializable两个标志性接口,所以Vector支持克隆、序列化。
2,Vector的源码解析
Vector的方法的原理和ArrayList非常相似,因此如果了解AarrayList那么理解Vector将会很简单!对于某些方法,本文在ArrayList集合中会有详细介绍,因此强烈建议先学习ArrayList:Java的ArrayList集合源码深度解析以及应用介绍。
Vector的底层数据结构就是一个数组,数组元素的类型为Object类型,对Vector的所有操作底层都是基于数组的。
初始容量:
调用空构造器时,立即初始化为10个容量的数组,也可以指定初始容量。
加载因子:
1,即存放数据时,如果存放数据后的容量大于底层数组的容量,那么首先扩容。
扩容增量:
新容量默认增加原容量的1倍,但是也可以在构造器指定扩容时的容量增量!如果新容量还是小于最小容量,则新容量还是等于最小容量!
2.1 主要类属性
相比于ArrayList,属性还是很简单的,多了一个capacityIncrement。
/**
* 存放元素的底层容器,就是一个数组,当前数组的长度就是Vector的容量
*/
protected Object[] elementData;
/**
* 元素的个数
*/
protected int elementCount;
/**
* 当vector的大小大于其容量时,其容量扩充的大小,即容量增量。如果容量增量小于或等于零,则每次需要增长时vector的容量都会加倍。
*/
protected int capacityIncrement;
2.2 构造器与初始化容量
2.2.1 Vector()
构造一个空集合,使其内部数据数组的大小初始化为10,容量增量为零。其源码为:
public Vector() {
this(10);
}
可以看到调用了另外一个构造方法。
2.2.2 Vector(int initialCapacity)
构造具有指定初始容量并且其容量增量等于零的空集合。
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
可以看到调用了另外一个构造方法。
2.2.3 Vector(int initialCapacity, int capacityIncrement)
构造具有指定的初始容量和容量增量的空集合。
public Vector(int initialCapacity, int capacityIncrement) {
//调用父类构造器
super();
//检查初始化容量,如果小于0就抛出异常
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
//初始化指定容量的数组
this.elementData = new Object[initialCapacity];
//初始化容量增量
this.capacityIncrement = capacityIncrement;
}
2.2.4 Vector(Collection<? extends E> c)
构造一个包含指定 collection 中的元素的集合,这些元素按其 collection 的迭代器返回元素的顺序排列。
public Vector(Collection<? extends E> c) {
//获取集合的元素数组,赋值给elementData
elementData