当 >= 是 运行 时,Java 是否隐式检查 > 和 ==?

Does Java implicitly check > and == when >= is run?

当我在代码中使用“>=”时,Java 会自动检查“==”和“>”吗?

我问这个问题的原因是因为在这样的 for 循环中:

for(int i = 0; i<N; i++){
    if(a > b) //do something
    else if(a == b) //do something different
}

这样做效率更高

for(int i = 0; i<N; i++){
    if(a >= b){
        if(a > b) //do something
        else // do the thing you would do for a == b
    }
}

if a>=b 不分别检查 a==b 和 a>b。

这是因为在第二个 for 循环中你检查条件 1 或 2 次,而对于第一个 for 循环你总是检查条件 2 次。

我知道时差可以忽略不计,但我只是好奇。

Java虚拟机has separate instructions if_icmpeq (equal), if_icmpge (greater or equal), and if_icmpgt (greater than) for the two cases. Whether it will be more efficient in fact depends on the CPU architecture; the x86 does have a single JGE (jump if greater or equal)指令。

正如前面的答案所示,这取决于系统架构,但一般来说,大于或等于的一般评估是用 "or" 分隔的两个条件。 即使我们假设比较不会分别执行这两个条件,您的推理仍然是错误的。
如果我们在现实中有 "a>b"
对于第一个循环,我们将比较 1 个条件“>”。
对于第二个循环,我们将比较 2 次,一次用于第一个 "non divisible >= " 条件,一次用于 ">"
所以这两个循环是等价的,最好根据你想要的可见性和你需要的实用性来选择。但是两者在平均比较上是一样的。

在最基本的层面上,比较只是一个减法,然后是对结果的测试。 CPU 在算术运算后设置标志:溢出和零与比较相关。如果结果为负,则设置溢出 (ov),如果操作数相等,则设置零 (z)。因此 1 < 2 将转换为 (1 - 2),从而导致 ov:1 和 z:0。

可以在单个操作中测试所需的标志值组合:

  • 小于:ov:1 和 z:0
  • 小于或等于:ov:1 或 z:1
  • 等于:z:1
  • 大于或等于:ov:0 或 z:1
  • 更大:ov:0 和 z:0

因此,通过良好的 JVM 实现,您会发现 >>=

之间没有可检测到的性能差异