ArrayList扩容的一点疑惑–什么情况下newCapacity - minCapacity < 0
我们先来看一段ArrayList
源码
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);
}
可能有些同学有点疑惑,在什么情况下newCapacity - minCapacity < 0
,那么我们上代码,这种情况下是出现了溢出,因为int类型出现了溢出,超过了其表示的最大范围:
public class Test{
public static void main(String[] args) {
//模拟oldCapacity接近于MAX_VALUE
int oldCapacity = Integer.MAX_VALUE-11111111;
//根据扩容算法,进行扩容
int newCapacity = oldCapacity + (oldCapacity >> 1);
System.out.println("oldCapacity-----:"+oldCapacity);
System.out.println("newCapacity-----:"+newCapacity);
}
}
结果如下:
oldCapacity-----:2136372536
newCapacity-----:-1090408492
欢迎大家评论交流,欢迎技术大佬,小白进群讨论:163690707(QQ群)
个人博客:请点击此处。