关于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会自动扩容为需要的容量大小
ArrayList在空参创建时初始容量为0,首次带参数创建则容量等于指定值。当需要扩容时,若需扩容量小于原容量的1.5倍,ArrayList会扩容至原容量的1.5倍;若需扩容量大于等于1.5倍,则扩容为所需容量。扩容过程涉及newLength和hugeLength方法,确保扩容后容量不超过SOFT_MAX_ARRAY_LENGTH。
7658

被折叠的 条评论
为什么被折叠?



