Vector底层扩容机制分析

Vector的构造器

Vector的无参构造器
Vector的无参构造器

 
 

指定容量大小的有参构造器
指定容量大小有参构造

指定初始化容量大小和每次扩容大小的有参构造器
在这里插入图片描述

 
 

Vector的重要属性

protected Object[] elementData; //Vector集合用于存放元素的数组
protected int elementCount; //用户记录集合中元素的个数
protected int capacityIncrement; //数组每次扩容指定的大小,如果为0则按两倍扩容

 
 

先上总结

1:Vector是线程安全的。
2.Vector默认初始化为10个大小,之后按照2倍进行扩容
3.Vector可以指定初始化大小和扩容大小

 
 

扩容机制源码分析

add方法

public synchronized boolean add(E e) {
        modCount++;  //集合修改次数+1
        ensureCapacityHelper(elementCount + 1); //ensureCapacityHelper用于确保数组的容量足矣添加新元素
        elementData[elementCount++] = e;//将要添加的元素添加到数组当中,返回true代表添加成功
        return true;
 }

这里使用到了synchronized关键字,所以是线程安全的。
 
 
 
ensureCapacityHelper(int minCapacity)方法

 private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0) //如果扩容后需要的容量超过了当前数组的容量
            grow(minCapacity); //则对数组进行扩容
}

 
 
grow(int minCapacity)方法

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length; //将旧数组元素的容量赋值给oldCapacity
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ? //如果capacityIncrement指定了每次扩容的大小,则按照当前数组容量  + capacityIncrement扩容,
                                         capacityIncrement : oldCapacity); //如果没有指定capacityIncrement,则每次默认按照两倍扩容
                                         
        if (newCapacity - minCapacity < 0) //判断预计扩容的大小,是否满足添加元素至少需要的空间大小
            newCapacity = minCapacity; //如果不满足,则将minCapacity作为新数组的扩容大小


        if (newCapacity - MAX_ARRAY_SIZE > 0) //判断预计扩容的大小是否超过了MAX_ARRAY_SIZE:
        																	//相当于Integer.MAX_VALUE - 8
            newCapacity = hugeCapacity(minCapacity);如果超过了,则调用hugeCapacity方法进行容量的处理

        elementData = Arrays.copyOf(elementData, newCapacity); //这里将旧数组元素拷贝到新数组,并按指定大小newCapacity进行扩容
}

 
 
hugeCapacity(int minCapacity)

private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow  //如果minCapacity的容量超过了Integer.MAX_VALUE,会将数转成二进制进行计算,变成负数,然后抛出内存溢出的错误
            throw new OutOfMemoryError();

        return (minCapacity > MAX_ARRAY_SIZE) ? //如果minCapacity还在Integer.MAX_VALUE的正数范围内,则会将Integer.MAX_VALUE进行返回作为新数组容量
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE; //否则将MAX_ARRAY_SIZE:Integer.MAX_VALUE - 8返回作为新数组容量
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值