switch语句原理及易错点
⽂章⽬录
不加break会怎样
观察下⾯的代码:
第⼀段代码是最常见的写法,也是最好的写法,约定俗成的每个条件语句后添加break。如果因为某种原因没有写break语句,没有对此情况进⾏过探究的话,可能还真不知道第⼆、三段代码会输出什么。
结论:如果不加break,程序从匹配成功的case语句开始,⼀直到遇见break语句或者执⾏完成所以条件语句块后才会跳出判断,不管后⾯的case语句是否匹配成功都会执⾏语句块中的代码,也就是上⾯的第⼆、三段代码。
有时候会故意缺省break语句来达到某种效果(例如⼏种判断都执⾏相同的代码块),不过这种情况极少,⽐如下⾯这个并没有太⼤意义的例⼦,当检测到当前⽉份是1、2、3、4⽉时都会输出“现在是第⼀季度”:
switch(month){
case1:
case2:
case3:
case4:
System.out.println("现在是第⼀季度");
break;
default:
break;
}
switch语句的原理
根据经验,当switch语句和if…else if…else语句可以实现相同功能(并且分⽀较多)时会尽量使⽤switch语句,因为switch语句的效率更⾼。
java switch case stringif…else if…else语句的执⾏⽅式是顺序执⾏所有判断语句,直到满⾜条件时执⾏语句代码块。
switch语句会维护⼀张跳转表,不管case判断语句的值是不是按照顺序的,内存中的地址表都会按照顺序进⾏排列。
switch语句会⽣成⼀个跳转表来指⽰实际的case分⽀的地址,⽽这个跳转表的索引号与switch变量的值
是相等的。从⽽,switch-case不⽤像if-else if那样遍历条件分⽀直到命中条件,⽽只需访问对应索引号的表项从⽽到达定位分⽀的⽬的。 具体地说,switch-case会⽣成⼀份表项数为case量+1的跳表,程序⾸先判断switch变量是否⼤于(⼩于)最⼤(最⼩)case 常量,若⼤于(⼩于),则跳到default分⽀处理;否则取得索引号为switch变量⼤⼩的跳表项的地址(即跳表的起始地址+表项⼤⼩*索引号),程序接着跳到此地址执⾏,到此完成了分⽀的跳转。
性能优化
因为if…else if…else语句会逐个条件进⾏判断,直到命中,所以应将机率⼤的条件置于前⾯,这样可以减少⽐较的次数
如果分⽀较少,⽐如⼩于4个,或者case语句判断的值跳跃较⼤时,没必要使⽤switch语句
编译器是根据时间和空间的消耗来决定那种⽅式效率更⾼,所以在Switch写判断条件的时候最好做到连续紧密,可以最⼤限度的节省时间和内存
switch语句的注意事项
当遇到 break 语句时,switch 才会终⽌,控制流将跳转到 switch 语句后的下⼀⾏
Java中的switch语句中表达式的值必须是整型、字符型、字符串类型(JDK7添加的新特性)和枚举类型
引申:case语句后常量表达式的值绝不可以是实数(有限⼩数、⽆限⼩数),例如case 1.1:即为不合法语句
C++中的switch语句中表达式的值必须是整型、字符型和枚举类型,不能是字符串类型
switch语句与其他控制语句的⼀个不同点:每个case中的多条语句加不加⼤括号均可
最好在switch中添加default语句,⽤来处理异常情况
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论