if(a-b <0)和if(a <b)之间的差异

我正在阅读Java的ArrayList源代码,并注意到if语句中的一些比较。

在Java

7中,该方法grow(int)使用

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

在Java 6

grow中不存在。ensureCapacity(int)但是该方法使用

if (newCapacity < minCapacity)

newCapacity = minCapacity;

更改背后的原因是什么?是性能问题还是样式?

我可以想象与零进行比较会更快,但是对我来说,执行完全减法只是为了检查它是否为负似乎有点过大。同样在字节码方面,这将涉及两个指令(ISUBIF_ICMPGE)而不是一个指令(IFGE)。

回答:

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已经溢出,这将是trueMAX_ARRAY_SIZE被定义为Integer.MAX_VALUE

- 8Integer.MIN_VALUE - (Integer.MAX_VALUE - 8) >

0true。将newCapacity因此被正确地处理:hugeCapacity方法返回MAX_ARRAY_SIZEInteger.MAX_VALUE

注意:这就是// overflow-conscious code此方法中的注释。

以上是 if(a-b &lt;0)和if(a &lt;b)之间的差异 的全部内容, 来源链接: utcz.com/qa/420215.html

回到顶部