Vector源码分析

实例代码

//无参构造器
        Vector vector = new Vector();
        //有参构造
        //Vector vector = new Vector(8);
        for (int i = 0; i < 10; i++) {
            vector.add(i);
        }

        vector.add("ChanV");
        System.out.println("vector = " + vector);

在此处打一个断开,开始debug
在这里插入图片描述

一、构造函数

1.1、指定容器大小的情况

	//调用有参构造,然后带着指定的容器大小去调用另一个有参构造方法
	public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }

在这里插入图片描述

	
	//有参构造器
	public Vector(int initialCapacity, int capacityIncrement) {
        super();
        //如果指定容器的大小为负数,就抛出异常
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        //创建一个指定容量的数组然后赋值给elementData 
        this.elementData = new Object[initialCapacity];
        //capacityIncrement 恒等于0
        this.capacityIncrement = capacityIncrement;
    }

在这里插入图片描述

1.2、指定容器大小的情况

	//无参构造方法,就是默认指定容量为10然后去调用有参构造方法
	public Vector() {
        this(10);
    }

在这里插入图片描述
接下来的过程跟有参构造的情况就是一样的了

在这里插入图片描述

二、将基本数据类型装箱为引用数据类型

因为Java集合只能存放引用数据类型,所以有一个将基本数据类型装箱为引用数据类型的过程
在这里插入图片描述

三、判断此时的容量够不够

public synchronized boolean add(E e) {
		//记录容器被修改的次数
        modCount++;
        //判断容器是否足够大的方法
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

在这里插入图片描述

private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        //需要的最小长度减去当前容器的大小 > 0, 
        //说明当前容量不够,进入到grow方法进行扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

在这里插入图片描述

四、开始扩容

private void grow(int minCapacity) {
        // overflow-conscious code
        
        //把当前容器的大小赋值给oldCapacity 
        int oldCapacity = elementData.length;
        //因为capacityIncrement恒为0,> 0 永不成立,
        //所以就是 int newCapacity = oldCapacity + oldCapacity 
        //这就意味着当容器的容量不够时,容量为扩容到原来的两倍
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        //随后调用Arrays.copyOf对原来的容器进行扩容
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

在这里插入图片描述

五、总结ArraysList 和 Vector

5.1、ArrayList

  • 底层结构:可变数组
  • 版本:JDK1.2
  • 线程安全效率:不安全,效率高
  • 扩容倍数:如果有参构造扩容 1.5 倍;如果是无参构造,第一次指定容量为10,从第二次开始按原来的 1.5 倍扩容

5.2、Vector

  • 底层结构:可变数组
  • 版本:JDK1.0
  • 线程安全效率:安全,效率不高
  • 扩容倍数:如果有参构造扩容 2 倍;如果是无参构造,第一次指定容量为10,从第二次开始按原来的 2 倍扩容
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值