if-else和三⽬运算符?:的对⽐
今天的地铁思考让我想起⼀个之前学C语⾔的时候⼀直没有验证的事情:既⽣瑜何⽣亮?
平时写代码的时候,似乎并没有太多的关注我应该选⽤什么条件判断语句,感觉判断条件或者两条⽀路语句复杂就本能地if-else。
遇到⼀些数值,字符的按条件赋值输出,就感觉if-else与这些简短语句⽓质不符,于是就⽤了三⽬运算符,使代码更简洁舒服。那么为什么有了if-else 还要⽤?:呢,只是为了代码更简洁吗,还是有什么不为⼈知的秘密[/嘿嘿]
我打算稍稍探寻⼀下,从两个⽅⾯来聊聊:效率和三⽬运算符的表达式特性
关于执⾏效率
我在⽹上⼀直没有到可靠的说辞或指南,有的说三⽬运算符效率⾼,还有的说⼀样的,所以我来测测(测试环境可能由于我的电脑性能,给定参数原因,不能得出确切的结论,仅供参考)
- if-else
public static void main(String[] args) {
int num=1000;
System.out.println("if-else 运⾏时间:");
long totalTime=0L;
for (int i = 1; i <=10 ; i++) {
long startTime = System.nanoTime();
if (num>500&&num%3!=0&&num/10==100){
num=1001;
}else{
num=0;
}
long endTime = System.nanoTime();
long result = endTime - startTime;
totalTime+=result;
System.out.println("第"+i+"次: " + result + " 纳秒");
}
System.out.println("平均时间为:"+totalTime/10+"纳秒");
}
执⾏结果:
三⽬运算符 ? :
public static void main(String[] args) {
int num = 1000;
System.out.println("? : 运⾏时间:");
long totalTime = 0L;
for (int i = 1; i <= 10; i++) {
long startTime = System.nanoTime();
num = num > 500 && num % 3 != 0 && num / 10 == 100 ? 1001 : 0;
long endTime = System.nanoTime();
long result = endTime - startTime;
totalTime += result;
System.out.println("第" + i + "次: " + result + " 纳秒");
}
System.out.println("平均时间为:" + totalTime / 10 + "纳秒");
}
执⾏结果:
从结论上来看,平均执⾏时间并没有太⼤差距,毕竟这⾥是以纳秒为单位,所以,暂且以为 ? :仅仅是简化代码的吧
如果哪位⼤佬有专业的权威的见解,请⼀定来“拍⼀拍”我,让我的⽯头落下。
表达式特性(BNP : binary numeric promotion)
⼆进制数值提升
- 在三⽬运算符中的第⼆和第三表达式的类型依据数值范围⼤的那个,将⼀个⼩数值的类型范围扩⼤,⽐如16位提升到32位,32位到64位,直观⼀点就是short提升到int,int提升到long,不同类型之间也可以提升,但是不⼀定是往两个其中的⼀个⾛,也有short和char,最终表达式是int的情况。
举⼏个栗⼦就⽐较清楚了
1,参数是int和byte,但是整个表达式的类型却是int
2,参数:int,char 表达式类型:int
3,参数:short,char 表达式类型:int
4,参数:int,float 表达式类型:float (如果字节数相同,会提升到浮点数)
5,参数:int,long 表达式类型:long
6,参数:long,double 表达式类型:double (如果字节数相同,会提升到浮点数)三目条件运算符?:的含义
7,同上的包装类,包装类在运算时⾃动拆箱,和基本数据类型结果⽆异
8,更具体⼀点,这⾥判断执⾏第三表达式,可因为第⼆表达式是浮点数,所以输出的9不是int的9⽽是浮点数的9.0
int number = 1000;
System.out.println(number<0?10.0:9);
console:
这么看来和似乎是⼀致的
总的来看,if-else和三⽬运算符并没有在今天分出胜负,我们依然可以按照之前的习惯写代码,只是让我们之后写代码的不⽤再犹豫和纠结⽤什么好,不⽤再想起他们俩之间的纠葛。在实际⽣产环境中按照各⾃团队规范来就好。这些也是最近才发现的,虽然感觉很少⽤到,但这不是⽬的。我们遇到的东西那么多,不会每样都能⽤到你的程序⾥,只是为了在下次遇到此类问题Bug时,能够游刃有余,这就是我们程序员鸭,突然感觉这篇⽂章啥也没做,但是却也不是啥也没做,哈哈奇怪咧。
参考⽂档:Java语⾔规范--
⾄此,若有纰漏,望各位不吝赐教
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论