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,更具体一点
```
int number = 1000;
System.out.println(number<0?10.0:9);
```
console:

总的来看,if-else和三目运算符并没有在今天分出胜负,我们依然可以按照之前的习惯写代码,只是让我们之后写代码的不用再犹豫和纠结用什么好,不用再想起他们俩之间的纠葛。在实际生产环境中按照各自团队规范来就好。这些也是最近才发现的,虽然感觉很少用到,但这不是目的。我们遇到的东西那么多,不会每样都能用到你的程序里,只是为了在下次遇到此类问题Bug时,能够游刃有余,这就是我们程序员鸭,突然感觉这篇文章啥也没做,但是却也不是啥也没做,哈哈奇怪咧。
- 参考文档:Java语言规范--https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-ConditionalExpression
至此,若有纰漏,望各位不吝赐教
if-else和三目运算符 ? : 的对比的更多相关文章
- 【黑客免杀攻防】读书笔记8 - 软件逆向工程基础2(if-else,三目运算符)
0x1 if-else分支 if-else分支4种状态 1.1 以常量为判断条件的简单if-else分支 C源代码: 单层if-else判断,常量为判断条件 int _tmain(int argc, ...
- Linux Awk使用案例总结(nginx日志统计,文件对比合并等)
知识点: 1)数组 数组是用来存储一系列值的变量,可通过索引来访问数组的值. Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串. 下标通常称为键,数组元素的键和值存储在Awk程序 ...
- 《新版阿里巴巴Java开发手册》提到的三目运算符的空指针问题到底是个怎么回事?
最近,阿里巴巴Java开发手册发布了最新版--泰山版,这个名字起的不错,一览众山小. 新版新增了30+规约,其中有一条规约引起了作者的关注,那就是手册中提到在三目运算符使用过程中,需要注意自动拆箱导致 ...
- Ignite性能测试以及对redis的对比
测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...
- [原] KVM 环境下MySQL性能对比
KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...
- arcgis api for js入门开发系列六地图分屏对比(含源代码)
上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...
- 嵌入式&iOS:回调函数(C)与block(OC)回调对比
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...
- C#跨平台手机应用开发工具Xamarin尝试 与Eclipse简单对比
Xamarin 支持使用C#开发基于Android.IOS.WindowsPhone应用开发,最大特点C#+跨平台,详细说明问度娘. 安装 研究 想体验研究的点击查看页面 Xamarin For Vi ...
随机推荐
- mysql 双机互备份
//1.创建用户CREATE USER 'dump'@'%' IDENTIFIED BY 'dump'; //2.开放权限GRANT ALL ON *.* TO 'dump'@'%'; //3.刷新权 ...
- 测试-spring源码摘取
首次加载idea是真的慢... 也许是我电脑性能太差... 我分析他内部有一套索引的机制,需要每次打开现建立... 没有固态的话,首次打开还不如eclipse 第一次使用博客园,以前都在csdn混~ ...
- 字符串相同ID竟然不同!!!
- Python变量和注释
1.变量与变量的作用: (1)什么是变量:变量源于数学,是计算机语言中能存储计算结果或能表示值抽象概念.变量可以通过变量名访问.在指令式语言中,变量通常是可变的:在Python中变量名必须是大小写英文 ...
- 2019-02-02 Python学习之死锁和Rlock
死锁:"当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞" e.g. import threading import time mutexboy ...
- (一)maven搭建和idea的配置
一.下载安装 前往 https://maven.apache.org/download.cgi 下载最新版的Maven程序.解压到任意目录 (要养成不起中文路径的好习惯,否则有时间出问题真的很难找) ...
- CSS文本相关之水平排列[4]
在正常流中,文本都是从左往右.自上而下排列显示,如果想要改变排列方向的话,可以通过CSS属性来改变. text-align属性 文本排列(text-align)可改变文本在水平上的方向,但不改变内部的 ...
- NAT网络地址转化和DHCP
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理.分配IP地址,使网络环境中的主机动态的获得I ...
- MFC_VC++_时间获取与保存列表控件内容到文件操作方法
MFC_VC++_时间获取与保存列表控件内容到excel文件操作方法 void CDataView::OnBnClickedBtnExporttoexcel() { CTime time = CTim ...
- 谷歌Chrome成最受欢迎的浏览器 它为啥好用?
毫无疑问,在搜索引擎领域,谷歌是绝对的主导者.但是,一般人却很容易低估我们受到的“控制”.比如,它的浏览器Chrome. 在不到九年的时间,谷歌Chrome浏览器已经成为全球使用最多的网页浏览器.目前 ...