JAVA switch 支持string 表达式的原理
2017-06-01 15:53
274 查看
虽然开发人员在 Java 源代码的 switch 语句中使用了字符串类型,但是在编译的过程中,编译器会根据源代码的含义来进行转换,将字符串类型转换成与整数类型兼容的格式。不同的 Java 编译器可能采用不同的方式来完成这个转换,并采用不同的优化策略。
反编译得到
从上面的代码中可以看出,原
4000
来用在 switch 语句中的字符串被替换成了对应的哈希值,而 case 子句的值也被换成了原来字符串常量的哈希值。经过这样的转换,Java 虚拟机所看到的仍然是与整数类型兼容的类型。在这里值得注意的是,在 case 子句对应的语句块中仍然需要使用 String 的 equals 方法来进行字符串比较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样。
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 方法来进行字符串比较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样。
相关文章推荐
- JDK 1.7新特性switch 支持string 表达式的原理
- Java 7 switch支持String类型的原理和关于switch一些细节
- 正则表达式:java中String对正则表达式的支持
- Java中字符串String Switch的实现原理
- java switch 支持 String
- Java-switch表达式中巧用String类型达到分支目的
- Java switch支持String类型分析
- [疯狂Java]正则表达式:Pattern、Matcher、String对正则表达式的支持
- 黑马程序员_java新特性测试(switch接受的要判断的表达式是String类型)
- Java中switch支持字符串原理
- Java的switch是否支持String作为参数,还支持哪些类型?
- Java的switch是否支持String作为参数,还支持哪些类型?
- Java 7新特性: switch中对String的支持
- JAVA | 37 - 正则表达式 | String 类对正则的支持
- JAVA中switch是否支持String类型参数?
- java7 switch case支持字符串的原理解析
- Java7版本: switch语句支持String、Enum类型(JDK1.5)与原来byte、short、char和int.
- Java 7新特性: switch中对String的支持
- Java7中的switch支持String的实现细节
- java的switch表达式支持的类型