位置: IT常识 - 正文

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

发布时间:2024-01-26
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怎么样)

  • edge浏览器是否可以安装第三方插件(edge浏览器inprivate)

    edge浏览器是否可以安装第三方插件(edge浏览器inprivate)

  • qq里bz是什么意思(扣扣b是什么意思)

    qq里bz是什么意思(扣扣b是什么意思)

  • 朋友圈点赞怎么换成头像(朋友圈点赞怎么不让共同好友看见)

    朋友圈点赞怎么换成头像(朋友圈点赞怎么不让共同好友看见)

  • 语音网络异常,聊天结束(语音显示网络异常)

    语音网络异常,聊天结束(语音显示网络异常)

  • 系统映像恢复什么意思(系统映像恢复文件在哪里)

    系统映像恢复什么意思(系统映像恢复文件在哪里)

  • 快手通过私信添加了我是什么意思(快手私信人怎样加微信)

    快手通过私信添加了我是什么意思(快手私信人怎样加微信)

  • 抖音火山版火苗和火力区别(抖音火山版火苗有什么用)

    抖音火山版火苗和火力区别(抖音火山版火苗有什么用)

  • 表格中计算公式怎么做(表格中计算公式如何自动计算出结果)

    表格中计算公式怎么做(表格中计算公式如何自动计算出结果)

  • 闲鱼商品保障服务怎么开通(闲鱼商品保障服务)

    闲鱼商品保障服务怎么开通(闲鱼商品保障服务)

  • iphonexsmax单卡和双卡什么区别(iphonexsmax单卡版有什么不一样)

    iphonexsmax单卡和双卡什么区别(iphonexsmax单卡版有什么不一样)

  • 苹果手机没设置闹钟为什么会响(苹果手机没设置密码开机却要密码打不开手机了)

    苹果手机没设置闹钟为什么会响(苹果手机没设置密码开机却要密码打不开手机了)

  • word文档的扩展名叫什么(word文档的扩展名有哪些)

    word文档的扩展名叫什么(word文档的扩展名有哪些)

  • 闲鱼小二审核凭证要多久(闲鱼小二审核凭证会打电话吗)

    闲鱼小二审核凭证要多久(闲鱼小二审核凭证会打电话吗)

  • 爱奇艺和奇异果的区别(爱奇艺和奇异果的会员能通用吗)

    爱奇艺和奇异果的区别(爱奇艺和奇异果的会员能通用吗)

  • 怎么删除表格里的文字(怎么删除表格里的空白行)

    怎么删除表格里的文字(怎么删除表格里的空白行)

  • soul定位关了可以开吗(soul定位没了咋办)

    soul定位关了可以开吗(soul定位没了咋办)

  • iphonex热点电脑连不上(香港公益 沉迷赌博)

    iphonex热点电脑连不上(香港公益 沉迷赌博)

  • 华为mate30怎么调音量(华为mate30怎么调节音量大小)

    华为mate30怎么调音量(华为mate30怎么调节音量大小)

  • 小米摄像头总是等待连接(小米摄像头总是链接失败)

    小米摄像头总是等待连接(小米摄像头总是链接失败)

  • 手机上出现反向充电怎么处理(手机出现反向双箭头)

    手机上出现反向充电怎么处理(手机出现反向双箭头)

  • 兼容模式什么意思(兼容模式是什么)

    兼容模式什么意思(兼容模式是什么)

  • 黑鲨2pro支持无线快充吗(黑鲨手机2pro支持无线充电吗)

    黑鲨2pro支持无线快充吗(黑鲨手机2pro支持无线充电吗)

  • ipone11单卡还是双卡(苹果11单卡好还是双卡)

    ipone11单卡还是双卡(苹果11单卡好还是双卡)

  • 为什么beats连不上ipad(为什么beats连不上安卓手机)

    为什么beats连不上ipad(为什么beats连不上安卓手机)

  • 安装Win11一直转圈怎么办?安装Win11一直转圈解决方法(安装win11一直转圈要多久?)

    安装Win11一直转圈怎么办?安装Win11一直转圈解决方法(安装win11一直转圈要多久?)

  • 公车私车税收区别
  • 企业所得税会计分录怎么做
  • 现金回收期计算公式
  • 季度预交所得税多年末应交少怎么计提
  • 年终奖是否列入社保基数
  • 2019年新注册公司
  • 工程造价超出职称怎么办
  • 农业企业土地租金会计分录
  • 专票入账用哪一联
  • 免税货物开成含税率的怎么报税?
  • 企业进口应税物资在进口环节应交的消费税,应计入
  • 网络技术服务费 税率
  • 企业间借款利息涉税处理
  • 未达起征点销售额和小微企业免税销售额
  • 组织机构代码证过期
  • 个贷系统平账专户利息分录
  • 关于工资薪金的情况说明
  • 开给客户的发票对方已认证
  • 进项发票已经抵扣怎么做退回处理
  • 以前年度损益调整借贷方向
  • 企业为职工缴纳的五险一金占工资总额的多少
  • 房地产销售佣金表格模板
  • 财务原始凭证
  • 应收账款怎么做分录
  • 银行汇票银行不予受理的是
  • 企业所得税申报表
  • zmweb.exe是什么进程
  • 试乘试驾车入账分录
  • 融资租赁的租金是什么意思
  • 增值税跟企业所得税的关系
  • 将城镇生活垃圾直接用作肥料
  • 若依移动端微信登录
  • win10iis安装配置
  • php _dir_
  • 利息收入做红字
  • 联邦学习攻击与防御综述
  • 谁能代替你啊
  • 实现php搜索框代码
  • 2020织梦建站教程全集
  • 管理费用和研发费用的关系
  • 土地增值税的计算方法公式
  • 利息分月计提按多少
  • 如何设置长期有效的二维码
  • 软件产品增值税即征即退
  • 如何分析成本费用高
  • 企业所得税汇算表
  • 取得税务师证书申请社保补贴
  • 一般纳税人每月开票不能超过多少
  • 金税盘维护费应该计入什么科目
  • 开票金额为什么是负数
  • 应收票据的计价应按
  • 所税税汇算补交怎么算
  • 垫款报销
  • 需要分摊的费用怎么做账
  • 公允价值的通俗理解
  • 计提坏账准备不属于企业的或有事项
  • 集团对子公司的管理办法
  • 贷款服务可以抵扣进项税额吗
  • 对账和结账的步骤及要求
  • 财务费用包括哪些费用
  • mysql绿色版配置
  • linux 使用技巧
  • win8创建系统映像
  • 挖掘出潜能
  • windows一键安装
  • windows media player找不到媒体流
  • 电脑没有网络连接怎么办
  • 批处理常用命令
  • bat批处理命令大全
  • node.js入门教程
  • shell 数组变量
  • jquery?
  • python开发环境有
  • activity的跳转
  • listview属性设置
  • python教程目录
  • 甘肃省政府非税收入电子发票在哪里打印
  • 提高增值税税率是什么意思
  • 深圳市税务网上注销流程图
  • 出口货物计算公式
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号