switch 语句用于多分支选择,在使用 switch(expr)时,expr 只能是一个枚举常量(内部
也是由整型或字符类型实现)或一个整数表达式,其中整数表达式可以是基本类型 int 或其对
应的包装类 Integer,当然也包括不同的长度整型,例如 short。由于 byte、short 和 char 类型的值都能够被隐式地转换为 int 类型,因此这些类型以及它们对应的包装类型都可以作为 switch
的表达式。但是,long、float、double、String类型不能够隐式地转换为 int 类型,因此它们不
能被用作 switch 的表达式。如果一定要使用 long、float 或 double 作为 switch 的参数,必须将其强制转换为 int 型才可以,例如,以下对 switch 中参数的使用就是非法的。
float a= 0.123;
switch(a)//错误,a不是整型或字符型变量
{
...
}
另外,与switch对应的是case语句,case语句之后可以是直接的常量数值,例如1,2 也可以是一个常量计算式,例如1+2等,还可以是final型的变量(final变量必须是编译时的常量),如final int a=0,但不能为变量或带有变量的表达式,如 i * 2等。更不能是浮点型数如1.1,1.2/2.等。
switch 对字符串的支持,其实是 int类型值的匹配。它的实现原理如下
通过对 case 后面的 Siring 对象调用 hashCode()方法,得到一个 int 类型的 hash 值,然后用这个
thash 值来唯一标识这个 case。那么当匹配时,首先调用这个字符串 hashCode()函数,获取
一个 hash 值(int 类型),用这个 hash 值来匹配所有 case,如果没有匹配成功,说明不存在;
如果匹配成功了,接着会调用字符串的 Siring. equals()方法进行匹配(至于为什么需要调用 e-
quals()方法。由此可以看出,String 变量不能为 null,同时,switch的
case 子句中使用的字符串也不能为 null。
在使用 switch 时,需要注意另外一个问题:一般必须在 case 语句结尾添加 break 语句。因
为一旦通过 switch 语句确定了入口点,就会顺序执行后面的代码,直到遇到关键字 break。否
则,会执行满足这个 case 之后的其他 case 的语句而不管 case 是否匹配,直到 switch 结束或者
遇到 break 为止。如果在 switch 中省略了 break 语句,那么匹配的 case 值后的所有情况(包括
default 情况)都会被执行。