关于ArrayList的扩容问题
首次空参创建ArrayList集合的容量
由图可知,ArrayList的容量为0
首次创建带参数的ArrayList集合
容量=指定参数
空参创建ArrayList数组的第一次扩容
此时第一次扩容为10
第二次及多次扩容
源码为:
public static int newLength(int oldLength, int minGrowth, int prefGrowth) {
int prefLength = oldLength + Math.max(minGrowth, prefGrowth);//此处的Max就是判断需要扩容了与扩容1.5倍的大小
if (0 < prefLength && prefLength <= SOFT_MAX_ARRAY_LENGTH) {
return prefLength;
} else {
return hugeLength(oldLength, minGrowth);
}
}
private static int hugeLength(int oldLength, int minGrowth) {
int minLength = oldLength + minGrowth;
if (minLength < 0) { // overflow
throw new OutOfMemoryError(
"Required array length " + oldLength + " + " + minGrowth + " is too large");
} else if (minLength <= SOFT_MAX_ARRAY_LENGTH) {
return SOFT_MAX_ARRAY_LENGTH;
} else {
return minLength;
}
}
}
若需要的扩容量<原数组容量的1.5倍
ArrayList会自动扩容为原集合容量的1.5倍
若需要的扩容量≥原数组容量的1.5倍
ArrayList会自动扩容为需要的容量大小