javaif和switch语句_Java中switch和if语句的区别
switch和if语句都是Java的选择语句,这两种语句都是允许在程序运⾏时控制程序的执⾏过程。那么,switch和if在具体⽤法上什么具体区别,下⾯今⽇⾸发⼩编给你介绍⼀下Java中switch和if语句的区别。
Java中switch和if语句的区别
switch和if-else相⽐,由于使⽤了Binary Tree算法,绝⼤部分情况下switch会快⼀点,除⾮是if-else的第⼀个条件就为true.
编译器编译switch与编译if…else…不同。不管有多少case,都直接跳转,不需逐个⽐较查询。
下⾯⼩编给⼤家提供了⼀段代码,帮助你理解switch语句。
/* $begin switch-c */
int switch_eg(int x)switch case判断字符串
{
int result = x;
switch (x) {
case 100:
result *= 13;
break;
case 102:
result += 10;
/* Fall through */
case 103:
result += 11;
break;
case 104:
case 106:
result *= result;
break;
default:
result = 0;
}
return result;
}
/* $end switch-c */
⽤GCC汇编出来的代码如下:
.file “switch.c”
.
version “01.01”
gcc2_compiled.:
.text
.align 4
.globl switch_eg
.type switch_eg,@function switch_eg:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%edx
leal -100(%edx),%eax cmpl ,%eax
ja .L9
jmp *.L10(,%eax,4)
.p2align 4,,7
.section .rodata
.align 4
.align 4
.L10:
.long .L4
.long .L9
.long .L5
.long .L6
.long .L8
.
long .L9
.long .L8
.text
.p2align 4,,7
.L4:
leal (%edx,%edx,2),%eax leal (%edx,%eax,4),%edx jmp .L3
.p2align 4,,7
.L5:
addl ,%edx
.L6:
addl ,%edx
jmp .L3
.p2align 4,,7
.L8:
imull %edx,%edx
jmp .L3
.p2align 4,,7
.L9:
xorl %edx,%edx
.L3:
movl %edx,%eax
movl %ebp,%esp
popl %ebp
ret
.Lfe1:
.size switch_eg,.Lfe1-switch_eg
.ident “GCC: (GNU) 2.95.3 20010315 (release)”
在上⾯的汇编代码中我们可以很清楚的看到switch部分被分配了⼀个连续的查表,switch case中不连续的部分也被添加上了相应的条⽬,switch表的⼤⼩不是根据case语句的多少,⽽是case的最⼤值的最⼩值之间的间距。在选择相应 的分⽀时,会先有⼀个cmp⼦句,如果⼤于查表的最⼤值,则跳转到default⼦句。⽽其他所有的case语句的耗时都回事。
相⽐于if-else结构,switch的效率绝对是要⾼很多的,但是switch使⽤查表的⽅式决定了case的条件必须是⼀个连续的常量。⽽if-else 则可以灵活的多。
可以看到if-else只是单纯地⼀个接⼀个⽐较,效率⽐较低,可以看出,switch的效率⼀般⽐if-else⾼
switch效率⾼,从汇编代码可以看出来。switch只计算⼀次值,然后都是test。
switch的效率与分⽀数⽆关。当只有分⽀⽐较少的时候,if效率⽐switch⾼(因为switch有跳转表)。分⽀⽐较多,那当然是switch。