总结: 01.Vector底层为Object数组 elementData (protected Object[] elementData;) 02.Vector是线程安全的 Vector类的操作方法带有synchronized 03.若使用无参构造创建集合 则elementData容量为10 因为无参构造器内部调用单参数的有参构造 且参数(初始容量)为10 扩容时将扩容为先前的容量的2倍 04.若使用有参构造创建集合 则elementData容量由参数指定 扩容时将扩容为先前容量的2倍
构造参数
无参构造:
public Vector() {
this(10);
}
有参构造:
public Vector(int initialCapacity) {
this(initialCapacity, 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;
}
一些参数
protected int capacityIncrement;
可见,无参构造实际在内部调用了单参数的有参构造,且传入的参数(初始容量)为10,故使用无参构造创建的集合,初始容量为10
双参数的有参构造,第二个参数为扩容大小,即集合进行扩容时增加的容量大小;若不调用双参数的有参构造,则扩容大小默认为当前容量,即扩容后的容量大小为先前容量的2倍
扩容机制
进入add方法,将先进入ensureCapacityHelper方法以判断elementData数组是否需要进行扩容,若需要则进行扩容(该方法内部调用扩容方法grow),elementCount + 1将作为minCapacity参数传入
注:elementCount为集合对象中存储的元素个数,与ArrayList中的size意义相同,且均通过size方法返回
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
进入ensureCapacityHelper方法,若minCapacity - elementData.length > 0,则调用grow方法进行扩容
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
进入grow方法,需先进行一次三元运算,确定使用默认扩容规则还是自定义扩容规则(oldCapacity + oldCapacity 还是 oldCapacity + capacityIncrement),而后进行一些简单判断,最后调用Arrays.copyOf方法进行扩容;Arrays.copyOf方法将返回一个新的数组,即扩容后的数组实际上和扩容前的数组不是同一个数组,但Arrays.copyOf方法会保留扩容前的数组中的元素,并在扩容的部分填入null
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}