Vector简介
Vector是Java中Collection集合实现类之一,底层由Object数组实现。与array数组相比,它具有动态扩展的能力(动态扩容)。
Vector继承关系
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Vector类继承AbstractList(抽象类),实现了List接口,Cloneable接口(克隆),RandomAccess接口(随机访问),Serializable接口(序列化)。
List接口继承了Collection接口,Collection接口继承了Iterable接口,故Vector是Collection接口的实现子类,同样也是Iterable接口(迭代器)的实现子类,同时具有迭代器的方法。
Vector list = new Vector(3);
list.add(1);
list.add(2);
list.add(3);
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
Vector源码分析
重要的成员变量如下:
//真正存放element的数组
protected Object[] elementData;
//数组的真实长度
protected int elementCount;
//向量增量
protected int capacityIncrement;
1.无参构造
/**
* 当调用Vector无参构造器时,底层elementData数组被初始化为一个长度为10的空数组
*/
public Vector() {
this(10);
}
2.有参构造
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
/**
* 当入参initialCapacity大于0时,底层elementData数组会被初始化为指定大小的Object数组
* 当入参initialCapacity等于0时,底层elementData数组会被赋值为一个空数组
* 当入参initialCapacity小于0时,直接抛IllegalArgumentException异常
* capacityIncrement的值为0
*/
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
3.add(E e)方法
//首先add方法被synchronized修饰,表示该方法是线程安全的
public synchronized boolean add(E e) {
//与ArrayList的add方法一样,modCount 表示修改次数。每次新增对象就会加1
modCount++;
//elementCount表示底层数组中存放对象的真实数量,每次新增对象时,真实数量就要加1
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
private void ensureCapacityHelper(int minCapacity) {
// minCapacity表示最小容量,假如原来数组中有10个对象,那么新增1个对象,那么最小容量就是11,否则装不下
// 最小容量减去数组的真实容量,如果大于0,就执行扩容操作
if (minCapacity - elementData.length > 0)
//真正扩容的方法,grow 表示 生长的意思
grow(minCapacity);
}
private void grow(int minCapacity) {
// 获取数组的真实容量(实际存放成员的个数)
int oldCapacity = elementData.length;
// 由于capacityIncrement = 0 ,因此newCapacity = oldCapacity + oldCapacity
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 将数组容量扩容至原来的2倍,并保留原数据
elementData = Arrays.copyOf(elementData, newCapacity);
}
add方法总结:
1.调用无参构造器创建Vector
①首次将底层数组的容量先被初始化为10。
②当Vector底层数组被填满后,再次add对象时,底层数组的容量会扩容至原来的2倍,并将原数组数据拷贝进来。
3.调用有参构造器创建Vector
①首先将底层数组初始化为指定入参的大小。
②当ArrayList底层数组被填满后,再次add对象时,底层数组的容量会扩容至原来的2倍,并将原数组数据拷贝进来。