【发布时间】:2016-01-13 20:10:37
【问题描述】:
我正在阅读 Java 的 ArrayList 源代码并注意到 if 语句中的一些比较。
在 Java 7 中,方法 grow(int) 使用
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
在 Java 6 中,grow 不存在。但是ensureCapacity(int) 方法使用
if (newCapacity < minCapacity)
newCapacity = minCapacity;
改变背后的原因是什么?是性能问题还是风格问题?
我可以想象与零进行比较会更快,但是为了检查它是否为负而执行完全减法对我来说似乎有点矫枉过正。同样在字节码方面,这将涉及两条指令(ISUB 和 IF_ICMPGE)而不是一条(IFGE)。
【问题讨论】:
-
@Tunaki 在防止溢出方面
if (newCapacity - minCapacity < 0)比if (newCapacity < minCapacity)更好吗? -
不知道上面提到的符号溢出是否确实是原因。减法似乎更适合溢出。组件可能会说“这不会溢出”,可能两个变量都是非负数。
-
仅供参考,您认为进行比较比执行“完全减法”更快。根据我的经验,在机器代码级别,通常通过执行减法、丢弃结果并检查结果标志来完成比较。
-
@David Dubois:OP 没有假设比较比减法快,但是 与零的比较 可能比两个任意值的比较更快,而且也是正确的假设当您首先执行实际减法以获得与零比较的值时,这不成立。这一切都很合理。
标签: java if-statement arraylist