进入源码
/* *1.先进入构造器,DEFAULTCAPACITY_EMPTY_ELEMENTDATA为一个空Object数组,所以初始化为一个空数组 * public ArrayList(){ this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } *2.先对其进行自动装箱,返回包装类对象 * public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } *3.进入到add方法中去,进入方法ensureCapacityInternal(翻译:确保内部空间),跳转到该方法 * public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } *4.进入方法,判断是否为空数组,进入由math.max()确定最大值,由于DEFAULT_CAPACITY=10,写死了, * 由于minCapacity = 0+1,意思就是最小空间需要几个,取得最大10个空间,minCapacity = 10; * 进入方法ensureExplicitCapacity(minCapacity); * private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } *5.判断当前最小容量是否大于当前数组,则进入grow(minCapacity)真正的进行扩容, * private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } * 6.进入该方法,第一次容量为oldCapacity = 0, * int newCapacity = oldCapacity + (oldCapacity >> 1); * 这套算法没有改变空间的大小,进行判断由于minCapacity= 10 * 把它赋值给newCapcity,由Array类进行 Arrays.copyOf(elementData, newCapacity);创建数组的大小 * 然后逐层返回方法; * 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); } * 7.直到返回到add方法,进行添加元素 elementData[size++] = e;的操作 * 并且每一次添加元素都会进入进行判断的校验 * public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; * */
所以综上所述扩容机制是走无参构造器的话,先进行10的大小容量先经行扩容,而后minCapacity的容量不够后进行自身1.5倍进行扩容。