!实际上,这个新特性是在编译器这个层次上实现的。而在java虚拟机和字节码这个层次上,还是只支持在switch语句中使用与整数类型兼容的类型。这么做的目的是为了减少这个特性所影响的范围,以降低实现的代价。在编译器层次实现的含义是,虽然开发人员在java源码的switch语句中使用了字符串类型,但是编译的过程中,编译器会根据源代码的含义来进行转换,将字符串类型转换成与整数兼容的格式。不同的java编译器可能采用不同的方式来完成这个转换,并采用不同的优化策略。比如:如果switch子句中只包含一个case子句,那么可以简单的将其转换成一个if语句。如果switch语句中包含一个case子句和一个default子句,那么可以将其转换成if-else语句。而对于最复杂的情况,只不过使用字符串的哈希值作为switch语句的表达式的值。
用在switch语句中的字符串被替换成了对应的哈希值,而case子句的值也被替换成原来字符串常用的哈希值。经过这样的转换,java虚拟机所看到的仍然是与整数类型兼容的类型。在这里值得注意的是,在case子句对应的语句块中仍然需要使用String的equals方法来进行字符串比较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样!
|