a < b并且
a - b < 0可能意味着两个不同的东西。考虑以下代码:
int a = Integer.MAX_VALUE;int b = Integer.MIN_VALUE;if (a < b) { System.out.println("a < b");}if (a - b < 0) { System.out.println("a - b < 0");}运行时,将仅打印
a - b < 0。发生的事情
a < b显然是错误的,但是
a - b溢出并变为
-1,这是负面的。
话虽如此,请考虑一下数组的长度确实接近
Integer.MAX_VALUE。中的代码
ArrayList如下所示:
int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0) newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity);
oldCapacity确实接近,
Integer.MAX_VALUE所以
newCapacity(是
oldCapacity + 0.5 *oldCapacity)可能溢出并变成
Integer.MIN_VALUE(即负数)。然后,将
minCapacity下溢 相减回正数。
此检查确保
if不会执行。如果代码编写为
if (newCapacity <minCapacity),则
true在这种情况下(由于
newCapacity为负)
newCapacity将被强制执行,
minCapacity而与无关
oldCapacity。
此溢出情况由下一个if处理。当
newCapacity已经溢出,这将是
true:
MAX_ARRAY_SIZE被定义为
Integer.MAX_VALUE- 8和
Integer.MIN_VALUE - (Integer.MAX_VALUE - 8) >0的
true。将
newCapacity因此被正确地处理:
hugeCapacity方法返回
MAX_ARRAY_SIZE或
Integer.MAX_VALUE。
注意:这就是
// overflow-conscious pre此方法中的注释。



