ArrayList扩容机制
1.构造函数
有三种
说第一种无参构造,默认初始容量为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); }