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

  • 机票和发票是一样的吗
  • 小微企业增值税起征点是多少
  • 银行代扣的社保怎么查询
  • 小规模纳税人免税销售额是含税还是不含税
  • 库存现金限额的概念
  • 长期借款借方登记归还的本金和利息
  • 事业单位结余如何做分录
  • 专利权转让的净收益计入
  • 员工罚款如何入账
  • 非货币性资产交换的会计处理
  • 购买投资理财产品放的会计处理怎么做?
  • 小规模企业跨季报税流程
  • 通行费发票如何开具
  • 发票纳税人识别号错了能重新开吗
  • 园林设计开票
  • 财库联网集中户扣了我的钱
  • 公司利润怎么提出来给老板
  • 外贸企业出口转内销过程中面临的问题
  • 免抵退税额抵减额怎么理解
  • 销项负数发票会计分录怎么写
  • 企业空气检测费应该计入什么会计科目核算?
  • 年增收节支总额与新增利税的关系
  • 出差人什么意思
  • 免税收入包括哪些收入
  • 合伙企业对外投资
  • 遗属补助是死亡当月发放还是次月发放
  • 公益事业捐赠
  • 账户禁用无法登录怎么办
  • 企业取得财政拨款怎么算
  • php二维数组添加数据
  • 苹果六微信
  • php支付功能
  • 编译报错place 30-681
  • 商品房的维修金该怎么交
  • 查补以前年度企业所得税的申报处理
  • 资源税纳税申报流程
  • 一般纳税人增值税优惠政策2023
  • 发票抵税是怎么申报的
  • 解读一篇文章
  • yolov5m
  • 未确认融资费用账务处理
  • 购进农产品增值税进项税额的确认方法
  • 支付航天信息服务费怎么入账
  • 新版python
  • vue使用什么语言
  • 深度学习数据集—水果数据集大合集
  • ChatGPT中国电话不能注册
  • thinkphp原理及优缺点
  • 车间打杂工
  • 企业注销时实收资本清算时要作资产处置收益交所得税吗
  • 处置固定资产开发票
  • 固定资产清理需要交企业所得税吗
  • 公司注册登记需要提交的资料包括
  • rabbitmq如何解决消息堆积问题
  • 企业合并发生的审计费用,评估费用
  • 银行只收不付解除方式
  • 哪种情形的货物或者服务可以采用竞争性谈判方式采购
  • 政府扶助资金
  • 长期股权投资收回账务处理
  • 公司是生产企业现在要开出租赁的发票可以开吗
  • 小规模纳税人购入货物收到增值税专用发票
  • 公司费用报销单样本
  • xp windows功能在哪里
  • docker部署zookeeper集群
  • jucheck.exe
  • 远程桌面连接xp系统
  • windows7怎
  • register.exe - register进程有什么用.是什么意思
  • win8更改电脑设置在哪
  • js查看浏览器信息
  • eclipse从本地导入项目
  • python2网络编程
  • nodejs遍历json数据
  • Unity3D之iTween
  • 遮罩有什么作用
  • 查找阴历日历
  • jquery常见问题
  • Unity multiplayer
  • 安卓手机管家推荐
  • 北京电子税务局实名认证
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设