编译生成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
类型是通过获取String
的hashCode
来进行选择的,也就是本质上还是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,关注我们,不断学习,不断提升
经验总结扩展阅读
- 甲流疫情突然来袭的句子 没逃过这次流感的说说
- 孩子甲流心里担心的文案 流感病毒肆虐的说说
- 宝宝得了甲流的文案 每次流感都中招的说说
- 儿子得了甲流的文案 得了流感发圈的说说
- 甲流很难受发烧的说说 流感季节发朋友圈
- 疫情当下感冒了怎么发朋友圈 被传染感冒的说说
- 没逃过这次流感的说说 最近甲流高峰期的说说
- 儿子生病了打点滴的心情说说 甲流打吊针的心情说说
- 买车发朋友圈的心情说说句子 发表提车心情的句子
- 买了人生第一辆车说说 拥有第一辆车发朋友圈