集合_Collection_Vector简述及扩容机制源码简析

总结:
01.Vector底层为Object数组 elementData (protected Object[] elementData;)
02.Vector是线程安全的 Vector类的操作方法带有synchronized
03.若使用无参构造创建集合 则elementData容量为10 因为无参构造器内部调用单参数的有参构造 且参数(初始容量)为10 扩容时将扩容为先前的容量的2倍
04.若使用有参构造创建集合 则elementData容量由参数指定 扩容时将扩容为先前容量的2倍

构造参数

无参构造:

    public Vector() {
        this(10);
    }

有参构造:

    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }
    public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }

一些参数 

    protected int capacityIncrement;

        可见,无参构造实际在内部调用了单参数的有参构造,且传入的参数(初始容量)为10,故使用无参构造创建的集合,初始容量为10

        双参数的有参构造,第二个参数为扩容大小,即集合进行扩容时增加的容量大小;若不调用双参数的有参构造,则扩容大小默认为当前容量,即扩容后的容量大小为先前容量的2倍

扩容机制

        进入add方法,将先进入ensureCapacityHelper方法以判断elementData数组是否需要进行扩容,若需要则进行扩容(该方法内部调用扩容方法grow),elementCount + 1将作为minCapacity参数传入

注:elementCount为集合对象中存储的元素个数,与ArrayList中的size意义相同,且均通过size方法返回

    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

        进入ensureCapacityHelper方法,若minCapacity - elementData.length > 0,则调用grow方法进行扩容

    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

        进入grow方法,需先进行一次三元运算,确定使用默认扩容规则还是自定义扩容规则(oldCapacity + oldCapacity 还是 oldCapacity + capacityIncrement),而后进行一些简单判断,最后调用Arrays.copyOf方法进行扩容;Arrays.copyOf方法将返回一个新的数组,即扩容后的数组实际上和扩容前的数组不是同一个数组,但Arrays.copyOf方法会保留扩容前的数组中的元素,并在扩容的部分填入null

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值