Java小白一文讲清Java中集合相关的知识点(三)

Vector底层结构和源码剖析

基本介绍

  • 定义说明
public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{.....}
  • Vector底层也是一个对象数组----protected Object[] elementData;
  • Vector 是线程同步的,即线程安全,Vector类的操作方法带有synchronized关键字修饰
    public synchronized int indexOf(Object o, int index) {
        if (o == null) {
            for (int i = index ; i < elementCount ; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index ; i < elementCount ; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

  • 在开发中,需要线程同步安全时,考虑使用Vector

  • Vector扩容如果是无参,默认是10,满了之后,就按2倍扩容;

    如果指定大小,则每次直接按2倍扩容;

//进入无参构造内部
    public Vector() {
        this(10);
    }
//加了10个元素,尝试继续添加1个元素时,此时的minCapacity为11
    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)//11-10>0,进入扩容机制
            grow(minCapacity);
    }
//扩容机制方法内部具体实现如下:
    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个元素,再尝试加一个元素时,此时的vector的空间存储情况如下:

在这里插入图片描述

//进入有参构造器内部,初始指定vector大小为9

//加了9个后,尝试加第10个元素,
    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);//此时的elementCount为9
        elementData[elementCount++] = e;
        return true;
    }
//进入确保容量的辅助函数内部
    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)//minCapacity为10,ele.length为9,结果大于0
            grow(minCapacity);
    }
//进入扩容机制内部具体实现
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;//9
        //newCap = 9+9 = 18,动态数组中,capacityIncrement其实就是自己想扩容多少空间,
        //不写的话,默认设置为0;
        /*比如,创建Vector的时候
       	Vector vector = new Vector(9,5);
       	那么,此时放了9个元素在vector中,再想放一个元素进去,
       	不显式初始化capacityIncrement的话,其底层会自动地2倍扩容,成18个空间
       	而显式初始化capacityIncrement为5之后,其底层会扩容成9+5=14个空间
        */
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)//18-9
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)//18-2147483639
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

调用有参构造,显式初始化容量为9个空间,加了9个元素之后,再想尝试加进去一个元素时,vector空间存储情况如下:

在这里插入图片描述

创建vector对象,显式初始化容量为9,并且还显式初始化capacityIncrement为5之后(一般是不初始化capacityIncrement,其默认为0,即需要扩容时,就扩容为oldCapacity的2倍),加了9个元素进去,再想尝试加进去一个元素,此时的vector的空间存储情况,如图:

在这里插入图片描述

Vector和ArrayList的比较

在这里插入图片描述

看到这儿的小伙伴,给你点个👍!!!下篇再见啦hhh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值