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; } } }
原理: jdk1.7在switch语句中可以支持string类型的参数,实际上,这个新特性是在编译器层次实现的,而在java虚拟机和字节码层次上,还是只支持switch语句中使用与整数类型兼容的类型。这样做的目的是为了减少这个特性所影响的范围,以降低实现的代价。在编译器层次实现的含义是,虽然开发人员在java源代码的switch语句中是用字符串类型,但是在编译的过程中,编译器会根据源代码的类型进行转换,将字符串类型转换成与整数类型兼容的类型,不同的java编译器可能采用不同的方式类实现这个转换,并采取不同的优化策略。
- 从反编译出来的代码可以看到,原来用在switch语句中的字符串被替换成了对应的哈希值,而case字句的值也被换成了原来字符串常量的哈希值,经过这样的转换,java虚拟机所看到的仍然是与整数类型兼容的类型,而case字句对应的语句块仍然需要使用String的equals方法来进行字符串的比较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的,进行字符串的比较是为了保证转换之后的代码逻辑与之前的完全一样
转载于:https://my.oschina.net/u/2611678/blog/638795