刚入java不久的程序猿,对于简单的使用已毫不满足,最终为了一探究竟,翻开了JDK的源码,以下观点为自己的理解及看了多篇博客的总结,欢迎各位大神指出不对的地方,当然也欢迎和我一样刚学的同学,一起加油努力吧~~
Vector是什么 |
说到Vector我们首先想到的应该就是集合,自然而然的我们也会与其他集合关联起来进行相应的比较,ArrayList集合与Vector比较区别是什么,肯定是线程安全问题了,具体的后面看源码再细细解释,因为LZ也是第一次看Vector源码,所以刚刚大致扫了一下感觉应该和ArrayList实现差不多,下面我们就去看看源码
Vector源码解析 |
按照以往套路,先看总体的体系
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
...
}
看过ArrayList源码的看到这个是不是很熟悉,继承AbstractList,实现List等接口,和ArrayList体系一样,具体的可以去看ArrayList源码解析,这里说下RandomAccess接口,之前没有太在意,今天特意点开看了下,该接口里没任何方法,那么实现这个接口有什么用呢,其实实现这个接口只是为了更明确的体现Vector这个类更适合随机访问,好了下面我们进入内部看看实现
/**
* 用来存储元素的数组
*/
protected Object[] elementData;
/**
* 用来记录元素数量
*/
protected int elementCount;
/**
* 当容量不够时,增加容量
*/
protected int capacityIncrement;
/** 版本编号 */
private static final long serialVersionUID = -2767605614048989439L;
接下来看构造函数
/**
* 构造函数,调用父类无参构造并初始化数组
*/
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
/**
* 构造函数,调用上面的构造,传入参数初始化大小,增长容量为0
*/
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
/**
* 同构造函数,调用上面构造,初始化大小为默认的10
*/
public Vector() {
this(10);
}
/**
* 构造函数,参数为集合
*/
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);
}
看了上面的构造发现和ArrayList几乎很像,只不过Vector里多了一个capacityIncrement,可以指定扩容大小,当然不指定或者为0时,默认扩大一倍。刚刚把源码看了一下和ArrayList没什么太大差别,所以这里就随便举几个例子吧
/**
* 常用的具有代表性的add方法
*/
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
/**
* remove方法,最终调用的是这个方法
*/
public synchronized boolean removeElement(Object obj) {
modCount++;
int i = indexOf(obj);
if (i >= 0) {
removeElementAt(i);
return true;
}
return false;
}
好了,就简单的列这两个比较具有代表性的,毕竟ArrayList源码已经看过了,这个和ArrayList又是一样的东西。最后总结一下吧,上面两个方法都加了synchronized,所以Vector是线程安全的,总的来说Vector与ArrayList很像,了解了ArrayList的实现我相信Vector应该很容易看懂。