前提:jdk版本为1.8.0_73
java代码:
public class test {public static void main(String[] args) throws Exception {String str = "a" + "b";for (int i = 0; i < 10; i++) {str = str.concat(i + "");}System.out.println(str);String a = "aszx";switch (a) {case "as":System.out.println(a);break;case "aszx":System.out.println(a);break;default:System.out.println("default:" + a);}}
}
字节码文件:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//public class test {public test() {}public static void main(String[] var0) throws Exception {String var1 = "ab";for(int var2 = 0; var2 < 10; ++var2) {var1 = var1.concat(var2 + "");}System.out.println(var1);String var5 = "aszx";byte var4 = -1;switch(var5.hashCode()) {case 3122:if (var5.equals("as")) {var4 = 0;}break;case 3004144:if (var5.equals("aszx")) {var4 = 1;}break;}switch(var4) {case 0:System.out.println(var5);break;case 1:System.out.println(var5);break;default:System.out.println("default:" + var5);}}
}
可以看出:
1.对于String类型变量,在定义时,用"+"连接,编译后会优化成一个常量
2.switch对String的支持,是通过String变量的hashCode码+equals()方法,将String变量映射到一个数字型变量(byte、short、int等,经实测,该变量类型与case分支数量有关),再使用switch选择