Vector源码分析
Vector源码分析
结论
- 无参构造,默认长度为10,满后按2倍扩容
- 指定大小,需要扩容时,每次按两倍扩容
源码分析
和ArrayList类似
无参构造时
无参构造器
public Vector() {
// 按照10个空间大小调用带参构造器
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];
// 将capacityIncrement赋值好
this.capacityIncrement = capacityIncrement;
}
add()方法
public synchronized boolean add(E e) {
// 修改次数++
modCount++;
// 扩容
ensureCapacityHelper(elementCount + 1);
// 添加数据
elementData[elementCount++] = e;
// 返回true
return true;
}
扩容
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
// 判断,在容量不够用时扩容
if (minCapacity - elementData.length > 0)
// 容量不够时调用
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
// (capacityIncrement > 0) ? capacityIncrement : oldCapacity说明
// 当capacityIncrement > 0时按自定义构造器的第二个参数的capacityIncrement来
// 此时newCapacity按elementData.length+自定义长度来
// 当capacityIncrement > 0不成立按oldCapacity也就是elementData.length
// 此时newCapacity为2*elementData.length
int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
// 判断大小,将newCapacity和minCapacity中最大值赋给newCapabcity
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果超出最大值
// 一般不会
if (newCapacity - MAX_ARRAY_SIZE > 0)
// 超出的话,调用hugeCapacity()
newCapacity = hugeCapacity(minCapacity);
// 利用拷贝对elementData进行扩容
elementData = Arrays.copyOf(elementData, newCapacity);
}