说说switch关键字( 二 )

编译生成Test.class 。拖入IDEA进行反编译得到如下代码:
public static void switchTest(String a) {byte var2 = -1;switch(a.hashCode()) {case 49:if (a.equals("1")) {var2 = 0;}break;case 50:if (a.equals("2")) {var2 = 1;}}switch(var2) {case 0:System.out.println("1");break;case 1:System.out.println("2");break;default:System.out.println("3");}}可以看见,JDK7 所支持的String类型是通过获取StringhashCode来进行选择的,也就是本质上还是int.为什么String可以这样干?这取决于String是一个不变类 。

为了防止hash碰撞,自动生成的代码中更加保险的进行了equals判断 。
再来看看Enum
public static void switchTest(Fruit a) {switch (a) {case Orange:System.out.println("Orange");break;case Apple:System.out.println("Apple");break;default:System.out.println("Banana");break;}}编译生成Test.class 。拖入IDEA进行反编译得到如下代码:
public static void switchTest(Fruit a) {switch(1.$SwitchMap$com$dengchengchao$Fruit[a.ordinal()]) {case 1:System.out.println("Orange");break;case 2:System.out.println("Apple");break;default:System.out.println("Banana");}}可以看到,枚举支持switch更加简单,直接通过枚举的顺序(order属性)即可作为相关case
总结总之:
  • switch的设计按道理来说,是比if-else要快的,但是在99.99%的情况下,他们性能差不多,除非case分支量巨大,但是在case分支过多的情况下,一般应该考虑使用多态重构了 。
  • switch虽然支持byte,int,short,char,enum,String但是本质上都是int,其他的只是编译器帮你进行了语法糖优化而已 。
尊重劳动成果,转载注明出处
~~
微信搜索公众号:StackTrace,关注我们,不断学习,不断提升

经验总结扩展阅读