ArrayList的扩容机制是如何实现的?

ArrayListList接口的实现类,在java.util下,它的底层结构是使用Object类型的数组实现的,特点是:元素有序,可重复。那么ArrayList是如何实现扩容呢?

  • 在实例化时使用无参构造方法创建ArrayList,初始化赋值的是一个空数组;
    ArrayList.class中源代码如下:
 	private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//ArrayList的无参构造方法
	public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
  • 当调用add()方法给ArrayList集合中添加一个元素时
  1. 首先调用ensureCapacityInternal()方法,参数minCapacity的值为(0+1),而在此方法中又调用ensureExplicitCapacity()。
  2. ensureExplicitCapacity()传参数又调用calculateCapacity()方法,在此方法中可以看出:如果elementData数组为空数组,那么返回DEFAULT_CAPACITYminCapacity之间最大的数,DEFAULT_CAPACITY为10,返回10;
  3. 再回到ensureExplicitCapacity()方法中,此时minCapacity为10,elementData.length为0,因此调用**grow()**方法扩容。
  4. 在grow()方法中oldCapacity = 0,newCapacity = 0,minCapacity = 10,条件newCapacity - minCapacity < 0满足,将minCapacity的值赋给newCapacity,最后通过Arrays工具类的**copyOf()**方法复制一个长度为10的新数组并让elementData指向它。
  5. 最后,回到add()方法中将新元素添加到elementData数组
  • 当数组容量不足时调用调用grow()方法扩容,每次扩容后容量为原容量的1.5倍。

    这里以添加第11次为例,此时数组容量为10,调用grow()方法继续扩容,oldCapacity = 10,newCapacity = 15(为原先容量的1.5倍);

  • 最大容量为Integer.MAX_VALUEInteger.MAX_VALUE - 8

以下为源码:

	private static final int DEFAULT_CAPACITY = 10;
	private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
	
 	public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
	private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

    private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }


  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值