collection接口下面有List和Set两个子接口,今天讲解一下List接口下的一个实现类vector
Vector:继承AbstractList,底层是一个Object数组,new一个Vector数组可以指定初始容量和容量增量,不指定的时候初始容量为10,默认增量为0,下面看一下源码:
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;
}
也可以把一个集合作为初始容量,这个时候集合中的元素会被存入到这个vector数组中,数组的容量就是集合数据的容量,以下源码
public Vector(Collection<? extends E> c) {
elementData = c.toArray();
elementCount = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}
因为是数组结构,有索引,所以可以根据索引查询、删除、修改数组元素,主要讲解一下add方法及扩容问题
add
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
可以看到该方法有一个synchronized锁,可以保证安全性,进行添加时候,ensureCapacityHelper方法使确认是否可以进行添加,方法里面的数据是(元素数量+1)下面看一下这个方法:
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
如果加一之后的容量减去元素的数量大于零,那么就执行grow方法:
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);
}
将加一后的元素数量长度赋值给旧的容量,新的容量=旧的容量+(容量增量是否大于零,如果大于零就为原来的值,否则为旧的容量,源码中定义容量增量默认为0,所以为oldCapacity),所以可以看出当容量不够的时候,扩容为当前容量*2
以上就是vector的基本讲解,各位看客辛苦了