ArrayList:基于数组实现,调用remove(Object o),add()方法时,在底层其实是重新拷贝了一个数组以remove(Object o)举例。
ArrayList的所有操作都是基于数组实现,在我们要在List中添加一个元素的时候,底层会去对数组进行一个扩容,就是重新copy一个数组,而新数组的长度就是旧数组的length+1。他会对这个新数组的长度进行以下判断:
1.他会根据旧数组的长度进行一个判断,newCapactiy(旧数组de length+旧数组的length >> 1 (相当于*2))。如果newCapactiy - 新数组的长度 <=0会进入第二层判断,如果是一个空数组就返回Math.max(DEFAULT_CAPACITY, minCapacity)DEFAULT_CAPACITY=10,minCapacity就是旧数组length+1。如果minCapacity < 0 就抛出异常。如果这两个条件都不满足的话就返回minCapacity。
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity <= 0) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return minCapacity;
}
2.如果不满足条件1的第一层判断的话就会返回以下的内容,MAX_ARRAY_SIZE是Interge.Max -8
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
hugeCapacity(minCapacity)又会进入判断。如果minCapacity < 0抛出异常。如果minCapacity>MAX_ARRAY_SIZE 就会返回Interge.Max_value,反之就返回Interge.Max -8
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE)
? Integer.MAX_VALUE
: MAX_ARRAY_SIZE;
}