Java Switch对各类型支持实现原理
switch
Java7开始,switch的参数可以是String类型了,这真的是一个很有用的改进,毕竟string还是挺常用的。到目前为止,switch支持的参数类型有:byte、short、int、char、String、enum。switch对各种类型参数的支持到底是怎么实现的呢?
byte、short、int
publicclassMain2{
publicstaticvoidmain(String[]args){
byteb=1;
switch(b){
case0:
System.out.println("0");
break;
case1:
System.out.println("1");
break;
default:
System.out.println("other");
}
}
}
反编译:
publicclassMain2{
publicMain2(){
}
publicstaticvoidmain(String[]args){
byteb=1;
switch(b){
case0:
System.out.println("0");
break;
case1:
System.out.println("1");
break;
default:
System.out.println("other");
}
}
}
将byte换成short、int,编译后的结果与上面展示的基本相同。
char
publicclassMain2{
publicstaticvoidmain(String[]args){
charc='0';
switch(c){
case'0':
System.out.println("0");
break;
case'1':
System.out.println("1");
break;
default:
System.out.println("other");
}
}
}
反编译:
publicclassMain2{
publicMain2(){
}
publicstaticvoidmain(String[]args){
charc=48;
switch(c){
case48:
System.out.println("0");
break;
case49:
System.out.println("1");
break;
default:
System.out.println("other");
}
}
}
从反编译的结果看,对char类型进行比较的时候,实际比较的是字符对应的ASCⅡ码,编译器把switch中char类型的变量转换成int类型的变量。
String
publicclassMain2{
publicstaticvoidmain(String[]args){
Strings="0";
switch(s){
case"0":
System.out.println("0");
break;
case"1":
System.out.println("1");
break;
default:
System.out.println("other");
}
}
}
反编译:
publicclassMain2{
publicMain2(){
}
publicstaticvoidmain(String[]args){
Strings="0";
bytevar3=-1;
switch(s.hashCode()){
case48:
if(s.equals("0")){
var3=0;
}
break;
case49:
if(s.equals("1")){
var3=1;
}
}
switch(var3){
case0:
System.out.println("0");
break;
case1:
System.out.println("1");
break;
default:
System.out.println("other");
}
}
}
从反编译的结果看,switch借助hashCode()和equals()实现了对String的支持——先使用hashCode进行初步判断,然后使用equal()进行二次校验(由于哈希冲突的存在,这个二次校验是必要的)。
publicenumColorEnum{
RED,YELLOW,BLUE,GREED
}
publicclassMain{
publicstaticvoidmain(String[]args){
ColorEnumcolor=ColorEnum.YELLOW;
switch(color){
caseRED:
System.out.println("red");
break;
caseYELLOW:
System.out.println("yellow");
break;
default:
System.out.println("other");
}
}
}
反编译:
/* *DecompiledwithCFR0.149. */ packagecom.learn.java; publicfinalclassColorEnum extendsEnum{ publicstaticfinal/*enum*/ColorEnumRED=newColorEnum("RED",0); publicstaticfinal/*enum*/ColorEnumYELLOW=newColorEnum("YELLOW",1); publicstaticfinal/*enum*/ColorEnumBLUE=newColorEnum("BLUE",2); publicstaticfinal/*enum*/ColorEnumGREED=newColorEnum("GREED",3); privatestaticfinal/*synthetic*/ColorEnum[]$VALUES; publicstaticColorEnum[]values(){ return(ColorEnum[])$VALUES.clone(); } publicstaticColorEnumvalueOf(Stringstring){ returnEnum.valueOf(ColorEnum.class,string); } privateColorEnum(Stringstring,intn){ super(string,n); } static{ $VALUES=newColorEnum[]{RED,YELLOW,BLUE,GREED}; } }
/*
*DecompiledwithCFR0.149.
*/
packagecom.learn.java;
importcom.learn.java.ColorEnum;
publicclassMain{
publicstaticvoidmain(String[]arrstring){
ColorEnumcolorEnum=ColorEnum.YELLOW;
switch(1.$SwitchMap$com$learn$java$ColorEnum[colorEnum.ordinal()]){
case1:{
System.out.println("red");
break;
}
case2:{
System.out.println("yellow");
break;
}
default:{
System.out.println("other");
}
}
}
}
上面的反编译结果表明,switch借助枚举类的序号实现对枚举类的支持。
总结
其实switch只支持整型,其他数据类型都是转换成整型后才使用的switch。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。