一、if分支结构
If() { }
If() {} else {}
If() {} if() {} if() {}
If() {} else if() {} else if() {} else {}
说明:
1) 可以进行嵌套,或者多重嵌套,但为保证代码逻辑清晰,提高可读性,尽量不要嵌套。
2) 按先后顺序依次判断是否成立,当一个if 语句检测为真,后面的else if 及 else语句都将被跳过。
在多分支条件下,若最多只有一个分支条件成立,使用If() {} else if() {} else if() {} else {} ,且按分支出现概率从大到小排放条件表达式,即概率上出现最多的放在最前面,减少程序判断次数,提高效率。
多分支同时成立且都需要处理的情况下,需使用If() {} if() {} if() {}。
二、switch结构
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
说明:
-
switch 语句中的变量类型可以是: byte、short、int 或者 char、String(从Java SE 7 开始),同时case 标签必须为字符串常量或字面量。
-
switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
-
case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
-
当变量的值与 case 语句的值相等时, case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
-
switch 语句可以包含一个 default 分支,该分支必须是switch 语句的最后一个分支。default 在没有case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
-
三、if与switch区别
if…else顺序判断条件分支,遇到表达式值为真时,执行代码,而switch…case生成一个跳转表来指示实际的case分支的地址,跳转表的索引号与switch变量的值相等,通过对应索引号的表项从而到达定位分支的目的。若switch变量为String类型,会有两个跳转表,先将String类型对应为一个int类型,再通过该int类型跳转到对应的分支。
四、if 与switch比较
A) 时间
效率–仅从跳转次数来比较两者的效率, 不考虑编译器的优化和条件传送
分支较多时,大于3,switch效率高。
分支较少时,小于3,if…else结构更好
B)空间
switch…case占用较多的代码空间,因为它要生成跳表。(特别是当case常量分布范围很大但实际有效值又比较少的情况,switch…case的空间利用率将变得较低。----未能深入理解)
C)适用范围
- switch…case只能处理case为常量(byte、short、int 或者 char。String(从Java SE 7 开始))的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch…case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是if else能应用于更多的场合,比较灵活。