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

  • vivox70pro+前置像素是多少(vivox70前置像素)

    vivox70pro+前置像素是多少(vivox70前置像素)

  • 华为手机测量身高功能在哪里打开(华为手机测量身高)

    华为手机测量身高功能在哪里打开(华为手机测量身高)

  • 华为荣耀10屏多大(华为荣耀10屏幕多长多宽)

    华为荣耀10屏多大(华为荣耀10屏幕多长多宽)

  • 小米蓝牙耳机声音小(小米蓝牙耳机声音小的解决方法)

    小米蓝牙耳机声音小(小米蓝牙耳机声音小的解决方法)

  • 支付宝怎么解绑多个手机号(支付宝怎么解绑淘宝账号)

    支付宝怎么解绑多个手机号(支付宝怎么解绑淘宝账号)

  • airpods充电盒多久充满(airpods充电盒多少电充电好)

    airpods充电盒多久充满(airpods充电盒多少电充电好)

  • iphonexs外壳能给x用吗(iphone xs的手机壳x可以用吗)

    iphonexs外壳能给x用吗(iphone xs的手机壳x可以用吗)

  • 微信里有钱能更改实名认证吗(微信里有钱更换实名认证怎么弄)

    微信里有钱能更改实名认证吗(微信里有钱更换实名认证怎么弄)

  • 如何取消待付款订单(信用卡如何取消自动扣款)

    如何取消待付款订单(信用卡如何取消自动扣款)

  • 抖音拍的视频怎么去掉水印(抖音拍的视频怎么剪掉不想要的部分)

    抖音拍的视频怎么去掉水印(抖音拍的视频怎么剪掉不想要的部分)

  • 不同品牌的对讲机可以互相通话吗(不同品牌的对讲机怎么配对)

    不同品牌的对讲机可以互相通话吗(不同品牌的对讲机怎么配对)

  • airpods躺着带不识别(airpods躺着不能用)

    airpods躺着带不识别(airpods躺着不能用)

  • 抖音在线有个绿点是什么意思(抖音在线有个绿点怎么设置)

    抖音在线有个绿点是什么意思(抖音在线有个绿点怎么设置)

  • 苹果授权服务商是什么(苹果授权服务商是官方售后吗)

    苹果授权服务商是什么(苹果授权服务商是官方售后吗)

  • 腾讯视频怎样下载到本地(腾讯视频怎样下载电影)

    腾讯视频怎样下载到本地(腾讯视频怎样下载电影)

  • 小米6x移动4g 什么意思(小米6x 4gb)

    小米6x移动4g 什么意思(小米6x 4gb)

  • 屏蔽对方qq会被发现吗(屏蔽对方qq对方能发消息过来吗)

    屏蔽对方qq会被发现吗(屏蔽对方qq对方能发消息过来吗)

  • 华为p30智能识物找不到(p30智能识物在哪里)

    华为p30智能识物找不到(p30智能识物在哪里)

  • 白天夜览对眼睛好吗(白天看夜间模式好吗)

    白天夜览对眼睛好吗(白天看夜间模式好吗)

  • 天猫精灵cc怎么监控(天猫精灵CC怎么拆)

    天猫精灵cc怎么监控(天猫精灵CC怎么拆)

  • 路由器重启后怎么办(路由器重启后怎么设置wifi密码)

    路由器重启后怎么办(路由器重启后怎么设置wifi密码)

  • 计算机类型大致分为哪三类(计算机 类型)

    计算机类型大致分为哪三类(计算机 类型)

  • 港版苹果11有双卡双待吗(港版苹果11是不是双卡)

    港版苹果11有双卡双待吗(港版苹果11是不是双卡)

  • 苹果8plus能不能控制空调(苹果8plus能不能添加门禁卡)

    苹果8plus能不能控制空调(苹果8plus能不能添加门禁卡)

  • vivox27能不能防水(vivox27防触摸怎么设置)

    vivox27能不能防水(vivox27防触摸怎么设置)

  • 小米平板复位键(小米平板重置出厂设置)

    小米平板复位键(小米平板重置出厂设置)

  • 小度1c怎么连接电视(小度1c怎么连接手机)

    小度1c怎么连接电视(小度1c怎么连接手机)

  • 微博怎么把经常访问删掉(微博怎么把经常访问放在功能卡片)

    微博怎么把经常访问删掉(微博怎么把经常访问放在功能卡片)

  • Win7系统下重启iis服务的操作方法(win7系统重启怎么还原系统)

    Win7系统下重启iis服务的操作方法(win7系统重启怎么还原系统)

  • 捐赠支出纳税调减
  • 建筑业的账务处理
  • 研发费用加计扣除是什么意思啊
  • 不征税收入和免税收入所对应的成本与费用能否税前扣除
  • 计提存货跌价准备的存货出售
  • 资产处置损益影响所有者权益总额吗
  • 电子税务局助信码领取后怎么用
  • 上市公司存货跌价准备怎么看
  • 房地产限购过程是什么
  • 应付汇差是什么意思
  • 个人独资企业个人所得税核定征收
  • 支付股东借款利息怎么交税
  • 代开建安发票怎么做账务处理?
  • 养老金余额退休能取吗
  • 补税款的分录应该怎么写
  • 企业购买小轿车进项税额可以抵扣吗
  • 企业如果亏损应该计提缴纳所得税吗
  • 建筑业如何核算费用
  • 关税税率表包括哪些税种
  • 我的初级备考经验--付出才有回报
  • 招待客户产生的住宿费
  • 合伙企业分红是免税企业需要缴纳什么税
  • 税控盘费用抵减增值税的账务处理
  • 五月份和六月份都有什么节日
  • 房子报废
  • 车船税没发票只在备注可以计入管理费用吗
  • u盘中毒症状
  • 停止恶意软件删除怎么办
  • 关联企业承担什么责任
  • PHP:pg_field_prtlen()的用法_PostgreSQL函数
  • linux动态扩容
  • 草丛里的野花像
  • 免抵退税额好难懂
  • 企业所得税的特殊优惠
  • 小狐狸吧
  • 营改增前建筑工程需交哪些税种
  • php批量删除操作记录
  • 小规模企业收到发票
  • php自动识别验证码
  • opencv dng
  • 核心书评价格
  • 收回已核销的坏账并入账是什么意思
  • 国税网如何下载申报后的财务报表
  • python连接网络
  • 增值税发票超过一年未抵扣
  • 所有者权益的确认依附于什么的确认
  • 小规模纳税人成本含税吗
  • 费用票有什么用处
  • 房屋租赁时需要交税吗
  • 机器设备计提折旧纳税调整
  • 详解增发万亿国债细节
  • sqlserver英文发音
  • mysql常用命令有哪些
  • 汽车销量多少才能赚钱
  • 企业赠送个人房产 所得税
  • 其他权益工具投资是金融资产吗
  • 给员工发工资时要交税吗
  • 模具报价成本核算方法
  • 收到微信公众号反诈骗风险提示
  • 应付职工薪酬应该在借方还是贷方
  • 小规模减免附加税的会计处理
  • 原始凭证丢了判刑吗
  • 账簿设制的一般程序
  • 日记账自动生成
  • u深度u盘启动盘制作工具无法进入电脑
  • win7系统控制面板在哪里打开
  • win8.1 下载
  • linux 常用系统
  • linux升级系统版本
  • linux在实际工作中的应用
  • linux ssh默认端口
  • threejs中文文档pdf
  • [置顶]bilinovel
  • shell数组遍历
  • exe取消隐藏属性
  • PYTHON内置函数,标准库,三方库的区别
  • [置顶]马粥街残酷史
  • 运输费用抵扣税率最新规定
  • 个体非正常户怎么解除
  • 广告费加计扣除标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设