Vector实现类JDK1.8源码

Vector是Java中的一个列表实现,它扩展了AbstractList并实现了List接口,保证了线程安全。底层数据结构是一个Object数组,添加元素时会进行扩容。与ArrayList不同,Vector每次扩容是原数组的两倍,而非1.5倍,这导致其效率较低,已被淘汰用于多线程场景。
摘要由CSDN通过智能技术生成

查看 Vector 源码

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable

Vector 实现了 List 接口

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
    // 底层为数组,数组类型为Object
    protected Object[] elementData;
    // 数组中的有效数据长度
    protected int elementCount;
    protected int capacityIncrement;
    
    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);
        // 给底层数组长度为10
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }
    
    // 添加元素方法 线程安全synchronized
    public synchronized boolean add(E e) {
        modCount++;
        // 相当于ensureCapacityHelper(11)
        ensureCapacityHelper(elementCount + 1);
        // 最开始elementCount为0,添加元素后elementCount+1操作
        elementData[elementCount++] = e;
        return true;
    }
    
    // minCapacity = 11
    private void ensureCapacityHelper(int minCapacity) {
        // 如果(11-10 > 0) 进行grow方法
        if (minCapacity - elementData.length > 0)
            // minCapacity = 11
            grow(minCapacity);
    }
    
    // minCapacity = 11
    private void grow(int minCapacity) {
        // oldCapacity = 10
        int oldCapacity = elementData.length;
        // 这里与arraylist有所不同,不是原数组的1.5倍扩容
        // 底层数组扩容为2倍 newCapacity = 10 + 10
        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 = Arrays.copyOf(elementData, newCapacity);
    }
}

联系:底层都是数组的扩容

区别:ArrayList 底层扩容长度为原数组的1.5倍 线程不安全 效率高

Vecotr 底层扩容长度为原数组的2倍 线程安全 效率低(淘汰)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dear丶TanTaiJin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值