
进入源码
/*
*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倍进行扩容。










