Vector共有4个构造函数
// 默认构造函数
Vector()
// capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。
Vector(int capacity)
// capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
Vector(int capacity, int capacityIncrement)
// 创建一个包含collection的Vector
Vector(Collection<? extends E> collection)
先看一下Vector的add()方法 :
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
很容易理解, 直接 在elementCount+1个位置插入这个对象。
指定位置插入对象:
public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
ensureCapacityHelper(elementCount + 1);
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}
和ArrayList的处理方法是一样的。将第index个位置往后移一个单位,然后在第index位置插入对象 。
public synchronized boolean addAll(Collection<? extends E> c) {
modCount++; //统计修改次数累加。
Object[] a = c.toArray(); // 集合转为数组
int numNew = a.length; // 要添加集合里对象的个数 。
ensureCapacityHelper(elementCount + numNew); //扩容
System.arraycopy(a, 0, elementData, elementCount, numNew); //追加集合。
elementCount += numNew;
return numNew != 0;
}
看一下移除的方法 。
public synchronized void removeElementAt(int index) {
modCount++;
if (index >= elementCount) { // 越界检查
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j); //从Index 开始,前移一个单位 。
}
elementCount--;
elementData[elementCount] = null; // 回收。
}
其它可以自行分析吧,比较简单 ,
小结:
1.Vector实现了List<E>, RandomAccess, Cloneable, java.io.Serializable接口。
2.Vector也同样采用了数组的储存方式,这一点和ArrayList是一样的。
3.Vector与ArrayList不同的是,所有方法都加上了synchronized同步关键词, 所以Vector是线程安全的,不过也一般比较少用, 一般都采用线程安全的CopyOnWriteArrayList。
网友评论