刚入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应该很容易看懂。
新闻热点
疑难解答