Java基础--Switch语句中表达式的类型
问题:
* byte可以作为switch的表达式吗?      可以
* long可以作为switch的表达式吗?      不可以
* String可以作为switch的表达式吗?      可以
在JDK1.7之前,switch(expression)中,expression只能是⼀个整数表达式或者枚举常量,整数表达式可以是int类型或Integer包装类型。
由于,byte,short,char都可以隐式转换为int类型,所以,这些类型也可以⽤作表达式。
JDK1.7以后,switch表达式也可以为String类型,具体原理参考这位⼤神的博客。
【转载】
  在jdk1.7中switch语句可以⽀持String类型的参数,实际上,这个新特性是在编译器这个层次上实现的。⽽在 Java 虚拟机和字节代码这个层次上,还是只⽀持在 switch 语句中使⽤与整数类型兼容的类型。
java switch case string这么做的⽬的是为了减少这个特性所影响的范围,以降低实现的代价。在编译器层次实现的含义是,虽然开发⼈员在 Java 源代码的 switch 语句中使⽤了字符串类型,但是在编译的过程中,编译器会根据源代码的含义来进⾏转换,将字符串类型转换成与整数类型兼容的格式。不同的 Java 编译器可能采⽤不同的⽅式来完成这个转换,并采⽤不同的优化策略。
例如:
1 2 3 4 5 6 7 8 9 10 11 12public class Test {
public void test(String type) {        switch(type) {
case"情况A":
break;
case"情况B":
break;
default:
break;
}
}
}
  编译成class之后,再通过反编译⼯具得到如下代码:1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23public class Test {
public void test(String paramString) {        String str = paramString;
int i = -1;
switch(str.hashCode()) {
case24455345:
if(!str.equals("情况A"))
break;
i = 0;
break;
case24455346:
if(!str.equals("情况B"))
break;
i = 1;
}
switch(i) {
case0:
break;
case1:
break;
}
}
}
  从上⾯的代码中可以看出,原来⽤在 switch 语句中的字符串被替换成了对应的哈希值,⽽ case ⼦句的值也被换成了原来字符串常量的哈希值。经过这样的转换,Java 虚拟机所看到的仍然是与整数类型兼容的类型。在这⾥值得注意的是,在 case ⼦句对应的语句块中仍然需要使⽤ String 的 equals ⽅法来进⾏字符串⽐较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是⼀样的。进⾏字符串⽐较是为了保证转换之后的代码逻辑与之前完全⼀样。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。