求大神解释:java中三目运算的底层实现原理及与if,else相比性能的差异

解决方案 »

  1.   

    底层得反汇编才能知道,估计与if else没什么区别。
    好处就是一条语言做了几条语句的事,代码好看,简单,方便。
      

  2.   

    个人觉得三目运算符就是if else的简写形式,跟效率无关。
      

  3.   

    http://zhidao.baidu.com/question/483906040.html  参考度友yang_bigarm的基于编译原理解释
      

  4.   

    Java看的是字节码不是汇编,我们写两个方法比较下:
    void f1(){
    b = a==888 ? 111 : 222;
    }
    void f2(){
    if(a==888)
    b = 111;
    else
    b = 222;
    }用javap -c查看生成的字节码:
    void fun1();
      Code:
         0: aload_0
         1: aload_0
         2: getfield      #2                  // Field a:I
         5: sipush        888
         8: if_icmpne     16
        11: bipush        111
        13: goto          19
        16: sipush        222
        19: putfield      #3                  // Field b:I
        22: returnvoid fun2();
      Code:
         0: aload_0
         1: getfield      #2                  // Field a:I
         4: sipush        888
         7: if_icmpne     19
        10: aload_0
        11: bipush        111
        13: putfield      #3                  // Field b:I
        16: goto          26
        19: aload_0
        20: sipush        222
        23: putfield      #3                  // Field b:I
        26: return比较一下发现if/else比?:多两行,但其实运行的时候执行的指令数是一样的。
    多两行指令的原因,是if/else的括号中可以放任何代码,而三目运算符功能单一。
      

  5.   

    我觉得多出两行固然是由两种语法结构的差异造成的(一句putfield 一句aload),但是这里,putfield      #3  这句在if else块中重复了,是不是可以把13 16两句简化成一句变成goto 23 呢
      

  6.   

    个人觉得应该更优于IF吧,但差别不会太大吧。如果分支多了,可读性就没有if分支好。
      

  7.   

    我觉得多出两行固然是由两种语法结构的差异造成的(一句putfield 一句aload),但是这里,putfield      #3  这句在if else块中重复了,是不是可以把13 16两句简化成一句变成goto 23 呢我的这段代码比较特殊,前后两个括号都是给b赋值的语句,所以可以提取出来,一般情况下是不行的。没有被提取应该只能说编译器没有优化得那么细吧。
      

  8.   

    同意,它是按照if else block严格分别处理的,不对其抱可能含有任何相同逻辑的假设