Java如何处理单个IF语句中的多个条件

Pau*_*aul 13 java

让我说我有这个:

if(bool1 && bool2 && bool3) {
...
}
Run Code Online (Sandbox Code Playgroud)

现在.如果bool1被评估为false,Java是否足够聪明,可以跳过检查bool2和bool2?java甚至从左到右检查它们?我问这个是因为我正在"排序"我的if中的条件到它们所需要的时间(从左边最便宜的那个开始).现在我不确定这是否给了我任何性能优势,因为我不知道Java如何处理这个问题.

Tom*_*icz 33

是的,Java(类似于其他主流语言)使用惰性评估短路,这意味着它尽可能少地进行评估.

这意味着以下代码是完全安全的:

if(p != null && p.getAge() > 10)
Run Code Online (Sandbox Code Playgroud)

此外,a || b永远不会评估b是否a评估true.

  • 抱歉挖掘旧线程,但为什么你有"&&和"?你的意思是"&&"? (3认同)

Pet*_*rey 14

如果bool1被评估为false,Java是否足够聪明,可以跳过检查bool2和bool2?

它不是一个聪明的问题,它是语言中规定的要求.否则你不能写像这样的表达式.

if(s != null && s.length() > 0)
Run Code Online (Sandbox Code Playgroud)

要么

if(s == null || s.length() == 0)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你使用&|它总是计算表达式的两侧.


Ole*_*eev 9

查看 Java 之间&和之间的区别&&(同样适用于|||).

&|刚刚逻辑运算符,而&&||有条件的逻辑运算符,它在你的榜样意味着

if(bool1 && bool2 && bool3) {
Run Code Online (Sandbox Code Playgroud)

将跳过bool2,bool3如果bool1是假,和

if(bool1 & bool2 & bool3) {
Run Code Online (Sandbox Code Playgroud)

将评估所有条件,无论其价值如何.

例如,给定:

boolean foo() {
    System.out.println("foo");
    return true;
}
Run Code Online (Sandbox Code Playgroud)

if(foo() | foo())将打印foo 两次,if(foo() || foo())- 只需一次.


Sri*_*thy 5

是的,这称为短路。

请看一下有关短路的维基百科页面