Java 中的三目运算符

关于 Java 的三目运算符 a ? b : c

之前在想,三目运算符和 if 语句哪个的效率更高一些,所以搜了一些文章。

其实可以从效率和代码可读性两方面来考虑,都需要根据具体情况具体分析,没有一般性的结论。

从效率角度来说,大多数情况下应该差距不大,因为,Java 编译器也做了一些优化,编译之后生成的字节码很有可能是几乎一样的。不过有些时候三目运算符中还会涉及到类型转换,自动拆装箱等问题。

从代码可读性来说,有些情况下三目运算符更具有可读性,有些情况下 if 语句更具有可读性,不能一概而论。

一个小测试

我也写了一个小测试跑了一下,发现基本情况下,两者效率相当。

测试代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class TestIfElse {
public static void main(String[] args) {
long startTime;
long durationNanoSecond1;
long durationNanoSecond2;
int iteration_max = 100000000;
boolean flag = true;

for(int iteration_num = 10; iteration_num<=iteration_max; iteration_num *= 10){
int[] array = new int[iteration_num];
startTime = System.nanoTime();
for(int i = 0;i<iteration_num;++i){
if(flag){
array[i] = i;
}
}
durationNanoSecond1 = System.nanoTime() - startTime;


startTime = System.nanoTime();
for(int i = 0;i<iteration_num;++i){
array[i] = flag ? i:1;
}
durationNanoSecond2 = System.nanoTime() - startTime;

double ratio = (double)durationNanoSecond1 / (double)durationNanoSecond2;
System.out.printf("If / Ternary Time Ratio %f: in %d times iteration\n", ratio, iteration_num);
}
}
}

运行结果:

1
2
3
4
5
6
7
8
If / Ternary Time Ratio 1.166429: in 10 times iteration
If / Ternary Time Ratio 1.166845: in 100 times iteration
If / Ternary Time Ratio 0.978240: in 1000 times iteration
If / Ternary Time Ratio 1.005771: in 10000 times iteration
If / Ternary Time Ratio 0.666807: in 100000 times iteration
If / Ternary Time Ratio 0.602651: in 1000000 times iteration
If / Ternary Time Ratio 2.331681: in 10000000 times iteration
If / Ternary Time Ratio 1.138700: in 100000000 times iteration

如果多运行几次,有时候会发现在某个量级上出现差距很大的情况,我觉得有可能是在某个时刻 JVM 虚拟机进程时间片用完了,JVM 在等待队列中的时间也被算进去了,导致在某个量级上差距比较大,通过调整循环的初始值,比如从 100 调到 10000,这种差距大的情况可能就不见了。

参考资料

  1. Which “if” construct is faster - statement or ternary operator? - StackOverflow
  2. If-else 三目运算符 底层实现 效率差异
  3. Java中你所轻视的三目运算符
  4. 你真的会用 Java 中的三目运算符吗? - 伯乐在线
  5. java细节:三目运算符和自动拆箱