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

  • 固定资产清理亏损的账务处理
  • 什么叫做供应链公司
  • 建筑安装增值税纳税地点
  • 去年收到一张普票超范围了怎么办
  • 公司雇佣退休人员怎样扣个税
  • 医疗单位门诊收费票据是发票吗
  • 个税0申报漏了2年可以补报
  • 连续三个月发烧怎么回事
  • 残保金申报在哪申报
  • 企业资产重组是不定期清查吗
  • 金融资产转回
  • 进口设备在海关处保存2年出售时 计算税怎么算
  • 库存方面的会计是做什么的
  • 租赁算投资吗
  • 买车时的保险包括哪些费用,多少钱
  • 减半征收企业所得税税率
  • 对外捐赠衣物怎样入账
  • 现汇账户和现钞账户可以转账吗
  • 公司低价卖房土地增值税计税方法是什么
  • 汇算清缴的所得税会计分录
  • 蔬菜免税会计分录怎么做
  • 公司账上收到职工的生育津贴如何做账?
  • 按照税收一般规定计算的折旧摊销金额
  • 支付版权费用怎么入账
  • 付临时工工资计入什么科目
  • 鸿蒙系统怎么开发
  • 三栏式明细账目录填写范本
  • 攀岗的企业性质有哪些
  • windows11怎么设置默认应用
  • 怎么实现增删改查
  • 实收资本可以大于注册资本吗
  • 协调费用应该怎么表述
  • 销货方发票红冲操作流程
  • 企业接受母公司代为缴纳税款会计分录
  • 员工的医药费
  • php常用语句
  • php curl 封装
  • php filesize
  • 租金和物业管理费税率
  • vue项目中技巧知识点
  • 雷达信号pri
  • ChatGPT助力校招----面试问题分享(四)
  • php ajax
  • vi操作命令进入编辑命令
  • 保函被索赔支付什么意思
  • 福利部门领用材料计入什么科目
  • 可以抵扣增值税进项税额的有哪些
  • 产业增加值是增长量吗
  • mysql数据库简单介绍
  • windows下MySQL 5.7.3.0安装配置图解教程(安装版)
  • 报税残疾人保障费怎么算
  • 航天税盘服务费开的普票可以抵税吗
  • 固定资产的定义是什么?
  • 小规模纳税人开专票税率是多少?
  • 建筑安装合同印花税率怎么算
  • 培训费发票可以抵扣吗
  • 自来水差额征税申报表填写
  • 技术服务费会计处理
  • vb.net invoke
  • win2003启动无法显示桌面
  • centos7配置免密登录
  • win8.1安装过程
  • centos 网卡顺序
  • centos6.5桌面版安装教程
  • linux ftp搭建教程
  • win81和win10
  • Win10最新版下载天翼云盘
  • Win10桌面版红石预览版14295更新(修复)、已知问题及解决方案汇总
  • iframe语法
  • 微信小程序tabbar字体颜色
  • angularjs和后端交互
  • python获取entry里输入的值
  • JS backgroundImage控制
  • python数据操作
  • 查验发票真伪
  • 企业所得税税率10%
  • 税控盘如何查询上报汇总成功
  • 重庆市国家税务局电子税务局官网
  • 政府对国税局的支持
  • 增值税申报表如何下载
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设