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。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。