Vector源码分析
一、未初始化的vector数组
1、准备工作
package com.liu.List;
import java.util.Vector;
public class Vector_ {
public static void main(String[] args) {
Vector<Object> vector = new Vector<>();
for(int i=0; i<10; i++){
vector.add("第"+(i+1)+"个元素");
}
vector.add(10);//超过10的情况
System.out.println("vector=>"+vector);
}
}
2、开始调试
a、未超过数组初始容量10
1、进入构造函数
/**
* Constructs an empty vector so that its internal data array
* has size {@code 10} and its standard capacity increment is
* zero.
*/
public Vector() {//默认设置容量为10
this(10);
}
进入this(10)
/**
* Constructs an empty vector with the specified initial capacity and
* with its capacity increment equal to zero.
*
* @param initialCapacity the initial capacity of the vector
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public Vector(int initialCapacity) {//调用有参构造函数
this(initialCapacity, 0);
}
进入initialCapacity
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)//判断容量是否合法
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
//elementData即为底层数组,在这里才真正建立了一个大小为initialCapacity的数组
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
跳出initialCapacity
跳出进入this(10)
跳出无参构造函数
进入add方法
public synchronized boolean add(E e) {
//此列表在结构上被修改的次数。结构修改是指改变结构尺寸的修改列表,或者以某种方式对其进行扰动,使迭代
//进步可能产生错误的结果
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
进入ensureCapacityHelper
private void ensureCapacityHelper(int minCapacity) {//确认数组容量
if (minCapacity - elementData.length > 0)//判断数组容量是否达到最大值,若达到则扩容,调用grow
grow(minCapacity);
}
跳出ensureCapacityHelper
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;//将新元素添加到elementData
return true;
}
b、超过初始容量10
1、进入add方法
public synchronized boolean add(E e) {
modCount++;
//确认elementCount + 1是否小于数组长度,若小于则直接添加,否则扩容
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
进入ensureCapacityHelper
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0) //11-10>0,则扩容
grow(minCapacity);
}
进入grow方法
private void grow(int minCapacity) {
// overflow-conscious code
//记录原数组长度
int oldCapacity = elementData.length;
//capacityIncrement:向量的容量在其大小大于其容量时自动增加的量。如果容量增量小于或等于零,则向量的容量将在每次需要增长时加倍。
//一般情况下,将数组扩容为原来的2倍
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);
}
跳出grow
跳出ensureCapacityHelper
回到add方法
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
跳出add
成功添加
二、初始化的vector数组
1、准备工作
package com.liu.List;
import java.util.Vector;
public class Vector_ {
public static void main(String[] args) {
Vector<Object> vector = new Vector<>(9);
for(int i=0; i<8; i++){
vector.add("第"+(i+1)+"个元素");
}
vector.add(9);
System.out.println("vector=>"+vector);
}
}
2、开始调试
只在这里有所差别
进入有参构造函数
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
进入this()
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
//直接新建容量为initialCapacity的elementData数组
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
跳出 Vector(int initialCapacity, int capacityIncrement)
跳出有参构造函数
三、总结(重点)
vector 默认容量为10
vector扩容为原来的2倍
vector线程安全