JDK源码分析-Vector

继承结构

  • 可以看出Vector集合和ArrayList集成结构一样,其实内部方法也是大同小异,这里不常用,就做学习其实现原理。

构造方法

    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;
    }

    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }


    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);
    }
  • 可以看出,Vector的构造函数和ArrayList的唯一区别在于多带了一个capacityIncrement的变量,这也导致数组的扩容方式有所不同。

扩容和增加数据

    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;   

    public synchronized boolean add(E e) {
        modCount++;
        //复制前判断是否需要扩容
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }


    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        //如果节点数大于数组的大小  则扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        // 当Vector的容量不足以容纳当前的全部元素,增加容量大小。
        //若容量增长因子capacityIncrement > 0,数组扩容增加capacityIncrement个长度
         // 若容量增长因子capacityIncrement <= 0,数组扩容增加2倍  x2
        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);
    }

Vector和ArrayList有一定的不同

          int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);

从这一句我们可以看出

   (增长容量)capacityIncrement > 0    增长倍数 :数组数量(旧容量)+ 增长容量

 ( 增长容量)capacityIncrement<=0     增长倍数 :数组数量(旧容量)+数组数量  也就2倍 x2

而ArrayList增长的倍数为1.5倍

线程安全性

  1. Vector是线程安全的,可以看到方法上都是直接通过synchronized进行同步的。

小结

  1. Vector也是内部也是数组实现
  2. Vector增长方法和ArrayList大同小异,增长容量大于0则直接,旧容量+增长容量,当增长容量小于等于0,扩容为旧容量的2倍
  3. Vector是线程安全性,内部使用synchronized同步方法,简单粗暴,缺点效率低。
  4. 由于Vector使用不多,这里只学习内部原理。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿军

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值