最近面试了不少Java开发工程师,他们大多数人对swich的用法已经描述不清还有甚者都被遗忘了,我感到很惊奇,我尝试阐述一下我对它的理解和用法。
swich 语法
switch源于C语言用在编程中,是一个判断选择代码(有时也被划归为一种选择语句)。其功能就是控制流程流转的。switch 语句可以从一系列代码中选出一段去执行。它的格式如下:
switch(integral-selector) {
case integral-value1 : statement; break;
case integral-value2 : statement; break;
case integral-value3 : statement; break;
case integral-value4 : statement; break;
case integral-value5 : statement; break;
// ...
default: statement;
}
其中,integral-selector (整数选择因子)是一个能够产生整数值的表达式,switch 能够将这个表达式的结果与每个 integral-value (整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相符的,就执行 default 语句。
在上面的定义中,大家会注意到每个 case 均以一个 break 结尾。这样可使执行流程跳转至 switch 主体的末尾。这是构建 switch 语句的一种传统方式,但 break 是可选的。若省略 break, 会继续执行后面的 case 语句的代码,直到遇到一个 break 为止。通常我们不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的 default 语句没有 break,因为执行流程已到了 break 的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在 default 语句的末尾放置一个 break,尽管它并没有任何实际的作用。
switch 语法规则
- switch语句非常有用,但在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则:
- 只能针对基本数据类型中的整型类型使用switch,这些类型包括int、char等。对于其他类型,则必须使用if语句。
- switch()的参数类型不能为实型 。
- case 标签必须为字符串常量或字面量。
- case标签必须是惟一性的表达式;也就是说,不允许两个case具有相同的值。
switch String 语法糖
Java 7 增加了在字符串上 switch 的用法。下例展示了从一组 String 中选择可能值的传统方法,以及新式方法:
public class StringSwitch {
public static void main(String[] args) {
String color = "red";
// 老的方式: 使用 if-then 判断
if("red".equals(color)) {
System.out.println("RED");
} else if("yellow".equals(color)) {
System.out.println("YELLOW");
} else if("blue".equals(color)) {
System.out.println("BLUE");
} else {
System.out.println("Unknown");
}
// 新的方法: 字符串搭配 switch
switch(color) {
case "red":
System.out.println("RED");
break;
case "yellow":
System.out.println("YELLOW");
break;
case "blue":
System.out.println("BLUE");
break;
default:
System.out.println("Unknown");
break;
}
}
}
输出结果:
RED
RED
一旦理解了 switch,你会明白这其实就是一个逻辑扩展的语法糖。新的编码方式能使得结果更清晰,更易于理解和维护。
上图是一个String switch源码(左)和编译后(右)案例,我们发现。switch 字符串是把 String color 的 hashCode 传入swich,找到相等的 case hashCode ,在通过 equals 判断传入的字符串与 case 字符串是否相等。
switch enum 好基友
enum 有一个很实用的特性,就是在 switch 语句中使用:
public enum CarBrand {
BMW, AUDI, BENZ,
}
public class Car {
CarBrand brand;
public Car(CarBrand brand){
this.brand = brand;
}
public void color(){
System.out.print("This car is ");
switch(brand) {
case BMW:
System.out.println("red color.");
break;
case AUDI:
case BENZ:
System.out.println("blue color.");
break;
default:
System.out.println("black color");
}
}
public static void main(String[] args) {
Car bmw = new Car(CarBrand.BMW),
audi = new Car(CarBrand.AUDI);
bmw.color();
audi.color();
}
}
输出结果:
This car is red color.
This car is blue color.
由于 switch 是在有限的可能值集合中选择,因此它与 enum 是绝佳的组合。注意,enum 的名称是如何能够倍加清楚地表明程序的目的的。
总结
程序必须在执行过程中控制它的世界并做出选择。在 Java 中,你需要执行控制语句来做出选择。
在 Java 中,涉及的关键字包括 if-else,while,do-while,for,return,break 和选择语句 switch。我们只有知己知彼清楚每种控制语句的用法及用途才能提升我们编码的质量和效率。