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 code