黑马程序员技术交流社区
标题:
switch问题
[打印本页]
作者:
陈建华
时间:
2012-12-6 15:22
标题:
switch问题
在java7中switch可以支持字符串,那么他的实现原理是什么
作者:
黑马王宁
时间:
2012-12-6 15:34
!实际上,这个新特性是在编译器这个层次上实现的。而在java虚拟机和字节码这个层次上,还是只支持在switch语句中使用与整数类型兼容的类型。这么做的目的是为了减少这个特性所影响的范围,以降低实现的代价。在编译器层次实现的含义是,虽然开发人员在java源码的switch语句中使用了字符串类型,但是编译的过程中,编译器会根据源代码的含义来进行转换,将字符串类型转换成与整数兼容的格式。不同的java编译器可能采用不同的方式来完成这个转换,并采用不同的优化策略。比如:如果switch子句中只包含一个case子句,那么可以简单的将其转换成一个if语句。如果switch语句中包含一个case子句和一个default子句,那么可以将其转换成if-else语句。而对于最复杂的情况,只不过使用字符串的哈希值作为switch语句的表达式的值。
用在switch语句中的字符串被替换成了对应的哈希值,而case子句的值也被替换成原来字符串常用的哈希值。经过这样的转换,java虚拟机所看到的仍然是与整数类型兼容的类型。在这里值得注意的是,在case子句对应的语句块中仍然需要使用String的equals方法来进行字符串比较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样!
作者:
齐银春
时间:
2012-12-6 16:34
switch后面的括号里面只能放int类型的值,注意是只能放int类型,但是放byte,short,char类型的也可以,是因为byte,short,shar可以自动提升(自动类型转换)为int,不是说就可以放它们,说白了,你放的byte,short,shar类型,然后他们会自动转换为int类型(宽化,自动转换并且安全),其实最后放的还是int类型!
Java中8种基本数据类型,boolean类型不参与转换,任何类型不能转换为boolean型,boolean也不能转换为其他类型,所以剩下7种,按照他们的表数范围,(也就是能表示的最大的数的大小,比如char是0到65535,byte是-128到正127)从小到大,排序,依次为:byte、short、char、int、long、float、double。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2