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

  • 华为nova5和nova5i区别(华为nova5和nova5pro怎么区分)

    华为nova5和nova5i区别(华为nova5和nova5pro怎么区分)

  • 苹果手机怎么关闭自动卸载不常用软件(苹果手机怎么关闭境外来电)

    苹果手机怎么关闭自动卸载不常用软件(苹果手机怎么关闭境外来电)

  • qq留言板删除操作频繁怎么办(qq留言板删除操作过于频繁)

    qq留言板删除操作频繁怎么办(qq留言板删除操作过于频繁)

  • 苹果xr最大支持多少瓦快充(苹果xr最大支持多少w无线快充)

    苹果xr最大支持多少瓦快充(苹果xr最大支持多少w无线快充)

  • ip地址错误网络无法接通win10(ip地址错误网络无法连接win7)

    ip地址错误网络无法接通win10(ip地址错误网络无法连接win7)

  • 华为nova7有呼吸灯吗(华为nova7呼吸灯怎么设置方法)

    华为nova7有呼吸灯吗(华为nova7呼吸灯怎么设置方法)

  • 芒果台弹幕打不开了(芒果台弹幕没有了)

    芒果台弹幕打不开了(芒果台弹幕没有了)

  • aqm al00是华为什么型号手机(aqm-aloo是华为什么型号)

    aqm al00是华为什么型号手机(aqm-aloo是华为什么型号)

  • 微信通话显示的是结束时间吗(微信通话显示的时间)

    微信通话显示的是结束时间吗(微信通话显示的时间)

  • 5g双模手机有哪些(5g双模手机与5g手机的区别)

    5g双模手机有哪些(5g双模手机与5g手机的区别)

  • 笔记本电脑无线网卡驱动怎么安装(笔记本电脑无线网)

    笔记本电脑无线网卡驱动怎么安装(笔记本电脑无线网)

  • vivox30上市了吗

    vivox30上市了吗

  • 什么是动态命令标签(动态命令怎么显示不了)

    什么是动态命令标签(动态命令怎么显示不了)

  • 苹果11pro截屏怎么截(苹果手机11pro截屏怎么用)

    苹果11pro截屏怎么截(苹果手机11pro截屏怎么用)

  • eclipse怎么写c语言(如何用eclipse编写c)

    eclipse怎么写c语言(如何用eclipse编写c)

  • 一加7怎么录入指纹(一加7怎么录入北京一卡通)

    一加7怎么录入指纹(一加7怎么录入北京一卡通)

  • 通常所说的主机主要包括(什么牌子的主机好)

    通常所说的主机主要包括(什么牌子的主机好)

  • 电子保修卡在手机哪里(电子保修卡在手机哪里小米)

    电子保修卡在手机哪里(电子保修卡在手机哪里小米)

  • 快手主页链接在哪复制(快手主页链接在哪里找)

    快手主页链接在哪复制(快手主页链接在哪里找)

  • iphone11摄像头功能(iphone11摄像头有啥用)

    iphone11摄像头功能(iphone11摄像头有啥用)

  • 用美颜相机拍照怎么把字去掉(用美颜相机拍照怎么把美颜logo去掉)

    用美颜相机拍照怎么把字去掉(用美颜相机拍照怎么把美颜logo去掉)

  • 二类卡能绑微信吗(微信身份证证件在哪里)

    二类卡能绑微信吗(微信身份证证件在哪里)

  • 微信视频长度超过5分钟怎么上传(微信视频长度超多少)

    微信视频长度超过5分钟怎么上传(微信视频长度超多少)

  • enteringpowermode电脑怎么开启(entering emergency mode)

    enteringpowermode电脑怎么开启(entering emergency mode)

  • 普通照片怎么添加水印(普通照片怎么添加水印相机的现场照片)

    普通照片怎么添加水印(普通照片怎么添加水印相机的现场照片)

  • 进口商品需要缴纳哪些税
  • 国税地税合并是成功的还是失败的
  • 预收款开发票,不确认收入可以吗?
  • 发票验旧以后还有用吗
  • 国家规定先打五联还是麻腮风
  • 高管个人所得税政策
  • 原材料亏损率怎么算
  • 支付结算有哪些工具
  • 购买材料产生的运杂费怎么做分录
  • 电子商业承兑对方接收了还可以作废吗
  • 发票开错了收入增多了当月分录如何红冲?
  • 土地使用权出资入股税费
  • 发票代表收据吗
  • 进项票失控对销项票有影响吗?
  • 电费发票勾选是啥意思
  • 金税盘减免分录
  • 怎么在网上申请变更姓名
  • 发票的审核之真假发票的查验
  • 财库联网集中户扣了我的钱
  • 小规模纳税人未达到起征点的增值税怎么做账
  • 17%和6%的票能直接抵扣吗?
  • 生产人员社保计入哪个科目
  • 可供出售金融资产发生减值会计处理
  • 账面销项税额与申报表不一致怎么处理
  • 预缴增值税附加税款怎么填写申报表
  • deepin linux安装教程
  • 事业单位专项经费包括哪些
  • PHP:pg_close()的用法_PostgreSQL函数
  • linux编译驱动文件
  • koeids.dll
  • 员工安置费标准出台
  • vite配置详解
  • 非货币性资产交换的记忆口诀
  • 非合理损耗怎么做分录
  • 都柏林圣三一学院图片
  • php环境搭建apache
  • js中的定时器
  • audit install success
  • php输出空格语句
  • thinkphp 多表查询
  • 可行性研究合同印花税
  • 库存现金科目的辅助核算项目为日记账
  • 合并范围外关联方需要函证吗
  • php usort函数
  • 5年前开的发票退货可以冲红吗?
  • 数据库管理中负责数据模式定义的数据库语言是
  • 成品油涉及范围有哪些
  • 小企业会计准则适用于哪些企业
  • 培训费其他费用的列支范围
  • access不能打开数据库
  • sql chr函数
  • 为什么收到要发1
  • 未分配利润为负数可以分红吗
  • 资产减值准备是资产的备抵科目吗
  • 预提成本和冲回成本金额不一致情况说明
  • 出口退税的范围是多少
  • 境外企业向境内企业提供技术服务
  • 税控设备维护费会计分录
  • 库存现金是负数怎么调
  • 高新企业研发项目规定几个
  • 发票抬头是个人税号怎么填
  • 会计分录借贷怎么分视频教程
  • mysql中的查询
  • 关机并重启是怎么回事
  • linux中使用fdisk命令进行硬盘分区
  • win8ui
  • windows累积更新
  • win8系统怎么更改无线网络IP
  • win8关机立马自动重启
  • 显示演示模式
  • win8怎么设置桌面
  • win8文件夹打不开
  • linux中退出
  • opengl怎么学
  • android自定义view ondraw有时候不执行
  • django pypi
  • angularjs2
  • jquery选择器的优势有哪些
  • javascript nextSibling 与 getNextElement(node) 使用介绍
  • 汽车购置税发票有什么用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设