【问题标题】:Which one is more efficient in terms of boolean in java? [closed]就java中的布尔值而言,哪一个更有效? [关闭]
【发布时间】:2016-05-06 03:16:43
【问题描述】:

就java中的布尔值而言,哪一个更有效?

Boolean boolean;
if(boolean == false) {}

if(!boolean) {}

【问题讨论】:

  • 这不是效率问题,而是可读性问题。得到你认为更容易阅读你的代码的东西,这就是你的编码风格。如果您不是在每纳秒都很重要的事情上工作,那么不要费心去优化类似的东西,只需优化可以提高复杂度类的东西。
  • 这个问题以前问过,没关系,基于意见
  • 就个人而言,我认为你应该避免像瘟疫一样的第一个。不小心说if(var = false) 太容易了。它们生成相同的字节码,因此没有性能差异。
  • 个人;我也尽量避免使用第二个版本。太容易忽视了!我非常喜欢“积极”的条件而不是消极的条件。
  • @resueman 忽略收到的警告并不容易。所以,== 是完美的(并且在变量名称为 statement 的情况下更容易理解:statement==false 而不是 !statement

标签: java performance if-statement boolean conditional-statements


【解决方案1】:

两者都是正确的,但第二个更优雅:

  if(!boolean) {}

【讨论】:

    【解决方案2】:

    性能差异完全是微不足道的;事实上,我想它们都编译成完全相同的bytecode(这意味着零性能差异)。选择你认为看起来更干净的选项。

    旁注:“boolean”是 Java 中的保留字,因此您需要一个不同的变量名。此外,除非您需要将布尔值用作对象(很少需要这样做),否则您应该使用 boolean 原始类型而不是 Boolean 对象类型; Boolean 对象类型有更多的内存开销。

    【讨论】:

      【解决方案3】:

      代码块:

      if(!boolean) {} 
      

      是一种更简洁的代码,可提高可读性。

      没有性能提升。

      【讨论】:

        【解决方案4】:

        哪个效率更高

        由于!bb==false 在字节码处被ifne 替换,这两种方法的性能相同。

        但是第二个版本

        if (!b){...}
        

        更安全,因为它避免了常见的错误/错别字,而不是==,我们将使用= like

        if (b = false){/* this code will never be executed */}
        

        Boolean 的证明。

        让我们看看如何编译这些方法:

        public void t1(Boolean b) {
            if (b == false) {
                System.out.println("foo");
            }
        }
        
        public void t2(Boolean b) {
            if (!b) {
                System.out.println("foo");
            }
        }
        

        javap -c NameOfClassWithTheseMethods 的帮助下,我们能够看到这一点

        t1会被编译成

          public void t1(java.lang.Boolean);
            Code:
               0: aload_1
               1: invokevirtual #16                 // Method java/lang/Boolean.booleanValue:()Z
               4: ifne          15
               7: getstatic     #22                 // Field java/lang/System.out:Ljava/io/PrintStream;
              10: ldc           #28                 // String foo
              12: invokevirtual #30                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
              15: return
        

        t2 进入

          public void t2(java.lang.Boolean);
            Code:
               0: aload_1
               1: invokevirtual #16                 // Method java/lang/Boolean.booleanValue:()Z
               4: ifne          15
               7: getstatic     #22                 // Field java/lang/System.out:Ljava/io/PrintStream;
              10: ldc           #28                 // String foo
              12: invokevirtual #30                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
              15: return
        

        所以对于这两种方法,编译器都生成了相同的字节码。


        boolean 的证明。

        如果我们重新编译

        public void b1(boolean b) {
            if (b == false) {
                System.out.println("foo");
            }
        }
        
        public void b2(boolean b) {
            if (!b) {
                System.out.println("foo");
            }
        }
        

        我们会得到:

          public void b1(boolean);
            Code:
               0: iload_1
               1: ifne          12
               4: getstatic     #22                 // Field java/lang/System.out:Ljava/io/PrintStream;
               7: ldc           #28                 // String foo
               9: invokevirtual #30                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
              12: return
        
          public void b2(boolean);
            Code:
               0: iload_1
               1: ifne          12
               4: getstatic     #22                 // Field java/lang/System.out:Ljava/io/PrintStream;
               7: ldc           #28                 // String foo
               9: invokevirtual #30                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
              12: return
        

        所以编译器又生成了相同的字节码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-21
          • 2019-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-19
          • 2018-05-18
          相关资源
          最近更新 更多