位置: IT常识 - 正文

说说switch关键字(switch关键账号教程)

编辑:rootadmin
Switch语法 switch作为Java内置关键字,却在项目中真正使用的比较少。关于switch,还是有那么一些奥秘的。 要什么switch,我有if-else 确实,项目中使用switch比较少的一个主要原因就在于它的作用能被if-else代替,况且switch对类型的限制,也阻碍了switch ... Switch语法

switch作为Java内置关键字,却在项目中真正使用的比较少。关于switch,还是有那么一些奥秘的。

要什么switch,我有if-else

确实,项目中使用switch比较少的一个主要原因就在于它的作用能被if-else代替,况且switch对类型的限制,也阻碍了switch的进一步使用。

先看看switch的语法:

switch(exp){ case exp1: break; case exp2: break; default: break;}

其中exp的类型限制为:byte ,short , int , char,及其包装类,以及枚举和String(JDK1.7)

为什么要有这些限制?

如果说,switch的功能和if-else的一模一样,那么它存在的意义在哪里?

答案是:switch和if-else在设计的时候,是有一定的性能差别的。

看代码:

public class Test { public static void switchTest(int a) { switch (a) { case 1: System.out.println("1"); break; case 2: System.out.println("2"); break; default: System.out.println("3"); break; } }}javap-cTest.class 结果如下: public static void switchTest(int); Code: 0: iload_0 1: lookupswitch { // 2 1: 28 2: 39 default: 50 } ...

这里面省略一些代码。

可以发现,switch是通过lookupswitch指令实现。那么lookupswitch指令是干嘛的呢?

在Java se8文档中的描述可以大概知道:

switch可以被编译为两种指令

lookupswitch:当switch的case比较稀疏的时候,使用该指令对int值的case进行一一比较,直至找到对应的case(这里的查找,可以优化为二分查找)tableswitch:当switch的case比较密集的时候,使用case的值作为switch的下标,可以在时间复杂度为O(1)的情况下找到对应的case(可以类比HashMap)

并且文档中还有一段描述:

推荐整理分享说说switch关键字(switch关键账号教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:switch 关键账号,switch语句的关键字有哪些,switch关键账号教程,switch语句中的关键字,switch关键账号教程,switch怎么关键,switch关键字的作用,switch语句中的关键字,内容如对您有帮助,希望把文章链接给更多的朋友!

The Java Virtual Machine's tableswitch and lookupswitch instructions operate only on int data. Because operations on byte, char, or short values are internally promoted to int, a switch whose expression evaluates to one of those types is compiled as though it evaluated to type int. If the chooseNear method had been written using type short, the same Java Virtual Machine instructions would have been generated as when using type int. Other numeric types must be narrowed to type int for use in a switch.

说说switch关键字(switch关键账号教程)

大概翻译如下: Java 虚拟机的 tableswitch 和 lookupswitch 指令仅对 int 数据进行操作。 因为对 byte、char 或 short 值的操作在内部被提升为 int,所以其表达式计算为这些类型之一的 switch 被编译为好像它计算为 int 类型。 如果使用 short 类型编写了 chooseNear 方法,则将生成与使用 int 类型时相同的 Java 虚拟机指令。 其他数字类型要在switch中使用必须转为int类型。

现在,我们应该能够明白,为什么switch关键字会有类型限制了,因为 switch所被翻译的关键字是被限制为int类型的,至于为什么是int,我猜应该是基于性能和实现的复杂度的考量吧。

int之外的类型

我们明白了byte,shor,char,int能被作为switch类型后,再看看枚举和String

public static void switchTest(String a) { switch (a) { case "1": System.out.println("1"); break; case "2": System.out.println("2"); break; default: System.out.println("3"); break; } }

编译生成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,关注我们,不断学习,不断提升

本文链接地址:https://www.jiuchutong.com/zhishi/310109.html 转载请保留说明!

上一篇:ps怎么局部虚化(photoshop虚化局部)

下一篇:帝国cms后台登录次数不超过5次限制(帝国cms怎么样)

  • iphone13充电头多少瓦(iphone13充电头多少v)

  • 12123怎么提交身体体检证明(12123怎么提交身份证照片)

  • 智学网在线考试有监控吗(智学网在线考试在哪)

  • 微信怎么关闭朋友圈(微信怎么关闭朋友圈?)

  • 打座机提示用户正忙(打座机提示用户忙是怎么回事)

  • vivox20录屏在哪(vivox20录屏在哪里开声音)

  • 华为m6卡槽怎么放卡(华为m6卡槽怎么打开)

  • 不打开微信就收不到视频通话(不打开微信就收不到信息是怎么回事)

  • 换主板需要注意什么(换主板需要注意些什么)

  • 华为手机夜间免打扰怎么设置(华为手机夜间免打扰)

  • 苹果8plus基带是高通还是英特尔(苹果8plus基带是什么的)

  • win10开机转圈很久才进系统(win10开机转圈很久进去黑屏)

  • 域名服务的主要功能(域名服务的主要作用是什么)

  • 抖音开直播要多少岁(抖音开直播要多少等级)

  • 抖音号怎样查手机号(抖音怎样查手机号)

  • 苹果手机怎么应用分身(苹果手机怎么应用分身QQ)

  • wpsword高级选项在哪里(wps的高级选项在哪里-zol问答)

  • 日版苹果11是双卡双待吗(日版苹果11是双卡吗)

  • 在快手买的东西怎么查物流(在快手买的东西被骗了,还能要回来钱吗)

  • vivox9多少英寸(vivox9i多少寸)

  • 微信文件助手存放的文件在哪(微信文件助手存在哪里)

  • 怎么让手机桌面上时间和日期显示出来(怎么让手机桌面显示时间)

  • 百度视频如何分享微信(百度视频如何分享到抖音)

  • 酷狗音乐取消自动续费(酷狗音乐取消自动续费怎么弄)

  • 开启office安全模式以检查问题(office2016安全模式)

  • win10护眼色怎么设置(windows10护眼色设置)

  • (二)匈牙利算法简介(匈牙利算法的实现原理)

  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设 电脑维修 湖南楚通运网络