什么是更好的 ?多个if语句,如果有多个条件,则为一个

3rg*_*rgo 39 java optimization if-statement multiple-conditions

对于我的工作,我必须开发一个小型Java应用程序来解析非常大的XML文件(~300k行)以选择非常具体的数据(使用Pattern),所以我试图对它进行一些优化.我想知道这两个片段之间哪个更好:

if (boolean_condition && matcher.find(string)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

要么

if (boolean_condition) {
    if (matcher.find(string)) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

更精确:

  • 这些if语句在循环内的每次迭代中执行(~20k次迭代)
  • boolean_conditionboolean使用外部函数在每次迭代时计算的
  • 如果boolean设置为false,我不需要测试匹配的正则表达式

谢谢你的帮助

ada*_*shr 53

我遵循的一条黄金法则是尽可能避免嵌套.但如果以使我的单一if条件过于复杂为代价,我不介意将其嵌套.

除此之外,您还在使用短路&&运营商.因此,如果布尔值为false,它甚至不会尝试匹配!

所以,

if (boolean_condition && matcher.find(string)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

是要走的路!

  • 考虑`if(x!= null && x.isY())`; 如果`&&`*没有*使评估短路,那么在x == null的瞬间就会爆炸. (10认同)

Jon*_*han 19

以下两种方法:

public void oneIf(boolean a, boolean b)
{
    if (a && b)
    {   
    }
}

public void twoIfs(boolean a, boolean b)
{
    if (a)
    {
        if (b)
        {       
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为方法体生成完全相同的字节代码,因此不会有任何性能差异,这意味着它纯粹是一种你使用的风格问题(我个人更喜欢第一种风格).

  • 我不想知道方法`public void noIfs(boolean a,boolean b){}`是否产生了相同的字节码;-) (5认同)
  • @Axel没有,它没有(我刚检查过!)毫不奇怪,Java编译器做了很少的优化,把它留给JVM在运行时做. (2认同)

JB *_*zet 5

两种方式都可以,如果第一个条件为假,则不会测试第二个条件。

使用使代码更具可读性和可理解性的方法。对于仅两种情况,第一种方式更具逻辑性和可读性。与&&,||和相关联的 5 或 6 个条件可能不再是这种情况!