您的位置:首页 > 编程语言 > Java开发

JAVA switch 支持string 表达式的原理

2017-06-01 15:53 274 查看
虽然开发人员在 Java 源代码的 switch 语句中使用了字符串类型,但是在编译的过程中,编译器会根据源代码的含义来进行转换,将字符串类型转换成与整数类型兼容的格式。不同的 Java 编译器可能采用不同的方式来完成这个转换,并采用不同的优化策略。

public class Test {

public void test(String type) {
switch (type) {
case "情况A":
break;
case "情况B":
break;
default:
break;
}
}
}


反编译得到

public class Test {
public void test(String paramString) {
String str = paramString;
int i = -1;
switch (str.hashCode()) {
case 24455345:
if (!str.equals("情况A"))
break;
i = 0;
break;
case 24455346:
if (!str.equals("情况B"))
break;
i = 1;
}
switch (i) {
case 0:
break;
case 1:
break;
}
}
}


从上面的代码中可以看出,原
4000
来用在 switch 语句中的字符串被替换成了对应的哈希值,而 case 子句的值也被换成了原来字符串常量的哈希值。经过这样的转换,Java 虚拟机所看到的仍然是与整数类型兼容的类型。在这里值得注意的是,在 case 子句对应的语句块中仍然需要使用 String 的 equals 方法来进行字符串比较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: