JDK之Vector源码解析

15 篇文章 0 订阅
13 篇文章 0 订阅

刚入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应该很容易看懂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值