Java中switch case详解

switch 语句也是多分支语句,它用于基于不同的条件来执行不同的代码。当要针对变量设置一系列的特定值的选项时,就可以使用 switch。

switch支持表达式的类型

JDK1.0-1.4 数据类型接受 byte、short、int、char

JDK1.5     数据类型接受 byte、short、int、char、enum(枚举)、(包装类型Character、Byte、Short、Integer)

JDK1.7     数据类型接受 byte、short、int、char、enum(枚举)、包装类型、String 六种类型

float、double都不能用于switch语句。

1对四个包装类的支持是因为java编译器在底层手动进行拆箱

2而对枚举类的支持是因为枚举类有一个ordinal方法,该方法实际上是一个int类型的数值

3jdk1.7开始支持String类型,但实际上String类型有一个hashCode算法,结果也是int类型

4而byte short char类型可以在不损失精度的情况下向上转型成int类型.所以总的来说,可以认为switch中只支持int类型。

switch中不可以有NULL

在switch语句中,表达式的值不能是null,否则会在运行时抛出NullPointerException。

在case子句中也不能使用null,否则会出现编译错误。

case语句

case后面可以是表达式或值(必须是常量),case字句的值是不能重复的。

case字句的值是不能重复的。对于字符串类型的也一样,但是字符串中可以包含Unicode转义字符。

重复值的检查是在Java编译器对Java源代码进行相关的词法转换之后才进行的。也就是说,有些case字句的值虽然在源代码中看起来是不同的,但是经词法转换之后是一样的,就会在成编译错误。比如:“男”和“\u7537”就是一个意思。

Java 7 switch支持String的实现原理:

这个新特性是在编译器这个层次上实现的。而在Java虚拟机和字节码这个层次上还是只支持在switch语句中使用与整数类型兼容的类型。这么做的目的就是为了减少这个特性所影响的范围,以降低实现的代价。

在编译器层次实现的含义是,虽然开发人员在Java源代码的switch语句中使用了字符串类型,但是在编译的过程中,编译器会根据源代码的含义进行转换,将字符串类型转换成与整数类型兼容的格式。不同的Java编译器可能采用不同的方式来转换,并采用不同的优化策略。比如:如果switch语句中只包含一个case语句,那么就可以简单的将其转换成一个if语句。如果包含一个case和一个default语句,就可以转换成if-else语句。而对于复杂的情况(多个case语句),也可以转换成Java 7 之前的switch语句,只不过使用字符串的哈希值作为switch语句表达式的值。经过转换,Java 虚拟机看到的仍然是与整数类型兼容的类型。这里要注意的是,在case字句中对应的语句块中仍然需要使用String的equals方法来进行字符串比较,这是因为哈希函数在映射的时候可能存在冲突,这样更加保险了。

多重if..和switch区别:

如果判断的是区间值用多重if(switch无法实现) ;如果是离散/单点值用 switch。

什么情况下要使用枚举而不是用String类型?

在Java 7之前switch中使用String类型的时候只能用枚举类型。而在Java 7 中由于switch语句增加了对字符串类型的支持,很多人就选择直接使用String类型。

但是这样有个缺点,就是可读性差、维护麻烦。假如switch语句在多个地方出现的时候,在程序中多次出现字符串常量是一个不好的现象,而用枚举就可以避免这种情况。

所以如果代码中多个地方使用swich语句来枚举字符串,就考虑用枚举类型进行替换。

switch(rank){
    case 1:
        System.out.println("笔记本电脑"); break ;
    case 2:
        System.out.println("U盘"); break ;//break:表示整个switch全部结束
    case 3:
        System.out.println("夏令营"); break ;
    default://else...
        System.out.println("不奖励..."); break ;
}

switch会用 rank和 所有的case匹配,如果匹配成功,则执行相应case后的语句,直到遇到break结束;

在switch中,如果rank和所有的case都不匹配,则执行default 。

default可省略

swtich只有遇到break和最后} 才结束,否则都不会结束

执行case 里面的语句时,如果没有break,则继续执行下一个case里面的语句。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值