ArrayList扩容机制

1.构造函数

有三种

image-20220209130002676

说第一种无参构造,默认初始容量为10

2.add函数

   /**
     * 将指定的元素追加到此列表的末尾。
     */
    public boolean add(E e) {
   //添加元素之前,先调用ensureCapacityInternal方法
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        //这里看到ArrayList添加元素的实质就相当于为数组赋值
        elementData[size++] = e;
        return true;
    }

 

进入add方法后调用ensureCapacityInternal 方法,进入ensureCapacityInternal方法后初始化容量,然后调用ensureExplicitCapacity判断是否需要扩容,

,grow方法是实现扩容的方法,需要扩容则扩大1.5位,使用位运算。然后调用Arrays.copyOf方法将elementData数组指向新的内存空间newCapacity的连续空间
从此方法中我们可以清晰的看出其实ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。

 //得到最小扩容量
    private void ensureCapacityInternal(int minCapacity) {
        //第二次调用ensureCapacityInternal方法后if判断后为假,因为不是空数组了
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
              // 获取默认的容量和传入参数的较大值
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }

 

  //判断是否需要扩容
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            //调用grow方法进行扩容,调用此方法代表已经开始扩容了
            grow(minCapacity);
    }

 

 
posted @ 2022-07-17 19:06  山野村夫01  阅读(148)  评论(0编辑  收藏  举报