swich语句详解

在java7之前,switch语句只支持short,byte,char,int以及枚举类型还有他们基本类型的包装类型。实际上switch只支持int类型,如果选择条件为short,byte,char,系统会自动转换为int类型。但在java7之后,switch语句的选择条件支持String类型。


long d = 5;
String str3 = "hello";
switch((int)d) {
	case 5:
	System.out.println("helloworld");
	break;
}



可以使用强制转换,那么编译器就不会报错.


switch支持String类型的实现原理

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


附:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1呢?



short i = 2;
i = (short)(i+2);//必须加强制转圜,否则会报错
i += 2;//java规定的运算符,编译器会对他进行处理

对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。


对于short s1 = 1; s1 += 1;由于 +=是java 语言规定的运算符,java 编译器会对它进行特殊处理,因此可以正确编译。