位置: 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怎么样)

  • 苹果最近通话记录只显示几天的(苹果最近通话记录删除了怎么找回来)

    苹果最近通话记录只显示几天的(苹果最近通话记录删除了怎么找回来)

  • 怎么充值qq音乐饭票(怎么充值qq音乐会员)

    怎么充值qq音乐饭票(怎么充值qq音乐会员)

  • 苹果13wifi断流怎么解决(ios13.7 wifi断流)

    苹果13wifi断流怎么解决(ios13.7 wifi断流)

  • 华硕笔记本如何进入bios界面(华硕笔记本如何进入U盘启动)

    华硕笔记本如何进入bios界面(华硕笔记本如何进入U盘启动)

  • 电脑版WPS文档纸张letter怎么设置(wps的纸张设置在哪里)

    电脑版WPS文档纸张letter怎么设置(wps的纸张设置在哪里)

  • 关闭微博点赞可见(取消微博点赞功能)

    关闭微博点赞可见(取消微博点赞功能)

  • 快手下拉菜单没有分类(快手下拉没有推荐呢)

    快手下拉菜单没有分类(快手下拉没有推荐呢)

  • OPPO手机怎么让通讯录里显示微信图标(oppo手机怎么让屏幕永不关闭)

    OPPO手机怎么让通讯录里显示微信图标(oppo手机怎么让屏幕永不关闭)

  • 华为手机语音唤醒功能在哪里设置(华为手机语音唤醒词怎么修改)

    华为手机语音唤醒功能在哪里设置(华为手机语音唤醒词怎么修改)

  • 抖音给主播点赞有什么用(抖音给主播点赞怎么看点到了多少)

    抖音给主播点赞有什么用(抖音给主播点赞怎么看点到了多少)

  • 华为手机怎么关闭深色模式(华为手机怎么关闭纯净模式)

    华为手机怎么关闭深色模式(华为手机怎么关闭纯净模式)

  • ppt怎么录屏录音(ppt录屏录音功能)

    ppt怎么录屏录音(ppt录屏录音功能)

  • match函数什么意思(match 函数)

    match函数什么意思(match 函数)

  • 手机qq讨论组怎么建立(手机qq讨论组怎么建立群聊)

    手机qq讨论组怎么建立(手机qq讨论组怎么建立群聊)

  • 四大基本存储结构(常见的存储结构有哪几种)

    四大基本存储结构(常见的存储结构有哪几种)

  • 华为荣耀畅想10plus什么时候上市(华为荣耀畅想10e配置)

    华为荣耀畅想10plus什么时候上市(华为荣耀畅想10e配置)

  • 图片100px是多少厘米(图片100px等于多少厘米)

    图片100px是多少厘米(图片100px等于多少厘米)

  • 苹果x3dtouch使用教程

    苹果x3dtouch使用教程

  • ipadmini需要贴膜吗(ipadmini用贴膜吗)

    ipadmini需要贴膜吗(ipadmini用贴膜吗)

  • 电话显示未接通啥意思(电话接了显示未接)

    电话显示未接通啥意思(电话接了显示未接)

  • 没有收到升级推送怎么办 最新升级华为鸿蒙2.0的方法(系统更新没有推送)

    没有收到升级推送怎么办 最新升级华为鸿蒙2.0的方法(系统更新没有推送)

  • 三星笔记本将预装win8改win7系统详细教程图解(三星笔记本预装系统)

    三星笔记本将预装win8改win7系统详细教程图解(三星笔记本预装系统)

  • 拔罐的好处和坏处(拔罐的好处和坏处除湿)

    拔罐的好处和坏处(拔罐的好处和坏处除湿)

  • 销售收入不含税怎么计算增值税额
  • 税务证需要多少费用
  • 进项税和销项税税率一样吗
  • 政府奖励收入要交企业所得税么
  • 亏损金额需要对抵实收金额吗
  • 餐饮通用机打发票可以报销吗
  • 代征手续费返还
  • 企业购买房屋的行为涉及哪些税种
  • 计提水利建设基金的依据
  • 固定资产管理的三大原则
  • 涉税软件技术维护费可以全额抵扣吗?
  • 一般纳税人出租不动产增值税税率
  • 事业单位开发成本占比
  • 公司帮员工缴纳个税,不从工资里扣,如何做账
  • 冲销暂估购入原材料的账务处理?
  • 自己开电子发票要什么软件
  • 房子报废
  • 木制手链品种
  • 企业结算备付金怎么做账
  • 股票质押得到的钱怎么算
  • 员工旅游计入什么费用
  • win10取消登陆密码
  • 把试驾车当新车卖,构成欺诈
  • 预缴企业所得税分录
  • apache去掉php后缀
  • 补缴免抵退
  • vue打包注意事项
  • 微信小程序web-view 添加悬浮按钮
  • zendstudio写好程序怎样运行
  • php中实现文件上传需要用到哪几个函数
  • ChatGPT5是否会影响人类的发展和工作?
  • 基于ansible的运维平台
  • 利用python实现Apriori关联规则算法
  • 倾向得分匹配后怎么进行回归
  • 呕心沥血的历史人物
  • umount -l命令
  • js数组方法filter
  • 个税网上申报流程视频
  • 进项税额计入其他流动资产
  • 税收罚款支出计入其他应付款吗对吗
  • 装货费用
  • php如何判断是移动还是pc
  • 织梦cms为什么不维护了
  • sqlserver创建维护计划
  • mssqlserver数据能删吗
  • 营改增后企业的税负控制
  • 企业的存货清查包括
  • 企业所得税汇算清缴会计分录
  • 固定资产改造更新后年限怎么算
  • 外地预缴税款流程
  • 汽车租赁的会计处理
  • 企业自建房屋建设方案
  • 开具红字增值税专用发票信息表需要盖章吗
  • 开票操作流程是什么
  • 一般纳税人开错税率严重吗
  • winxp u盘拒绝访问
  • VMware虚拟机安装苹果Mac OS
  • vmware虚拟机安装Linux教程
  • watchdog. sys
  • ubuntu rar压缩
  • centos如何安装vim
  • win10系统开机密码设置方法
  • vmware下载不了
  • win7系统运行怎么打开
  • linux小技巧
  • unity3d第三人称角色控制器
  • javascript ts
  • 同步数据和异步数据的区别
  • 一个项目引多个项目
  • 一键配置天赋的台词
  • perl语言
  • javascript之typeof、instanceof操作符使用探讨
  • unityai寻路
  • jquery中判断某个类是否存在的方法
  • hashmap详细讲解
  • javascript基本语句
  • jquery中遍历指定的对象和数组是哪个方法
  • 成都税务局网上办事大厅
  • 港口的码头用地
  • 12366几点上班人工服务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设