求大神解释:java中三目运算的底层实现原理及与if,else相比性能的差异 求大神解释:java中三目运算的底层实现原理及与if,else相比性能的差异 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 底层得反汇编才能知道,估计与if else没什么区别。好处就是一条语言做了几条语句的事,代码好看,简单,方便。 个人觉得三目运算符就是if else的简写形式,跟效率无关。 http://zhidao.baidu.com/question/483906040.html 参考度友yang_bigarm的基于编译原理解释 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的括号中可以放任何代码,而三目运算符功能单一。 我觉得多出两行固然是由两种语法结构的差异造成的(一句putfield 一句aload),但是这里,putfield #3 这句在if else块中重复了,是不是可以把13 16两句简化成一句变成goto 23 呢 个人觉得应该更优于IF吧,但差别不会太大吧。如果分支多了,可读性就没有if分支好。 我觉得多出两行固然是由两种语法结构的差异造成的(一句putfield 一句aload),但是这里,putfield #3 这句在if else块中重复了,是不是可以把13 16两句简化成一句变成goto 23 呢我的这段代码比较特殊,前后两个括号都是给b赋值的语句,所以可以提取出来,一般情况下是不行的。没有被提取应该只能说编译器没有优化得那么细吧。 同意,它是按照if else block严格分别处理的,不对其抱可能含有任何相同逻辑的假设 初学JAVA,请问这段程序为什么会提示损失精度? 谢谢大牛们给小伟的指点 小伟还有问题 分布式互斥算法问题 东莞华宝实业有限公司!!!! 关于object []的使用 CORBA---CORBA IDL---IDL TO JAVA。"idlj" 如何处理数学符号的问题。请指教!分不够可以再加, JBoss3.0.2无法进行SqlServer的数据库操作(insert,delete..)! 简单的问题。怎么得到字体列表。 Java Applet 中是否有定时器的机制 maven clean compile执行这句时为何要下载很多的jar包 怎么添加背景音乐
好处就是一条语言做了几条语句的事,代码好看,简单,方便。
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的括号中可以放任何代码,而三目运算符功能单一。