应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

面试官Java中Switch支持String字符串?为什么不

  我们知道JavaSwitch支持byte、short、int类型,在JDK1。5时,支持了枚举类型,在JDK1。7时,又支持了String类型。那么它为什么就不能支持long类型呢,明明它跟byte、short、int一样都是数值型,它又是咋支持String类型的呢?一、结论
  不卖关子,先说结论:
  switch底层是使用int型来进行判断的,即使是枚举、String类型,最终也是转变成int型。由于long型表示范围大于int型,因此不支持long类型。
  下面详细介绍下各个类型是如何被转变成int类型的,使用的编译命令为javac,反编译网站为:http:javare。cn二、枚举类型是咋变成int类型的?
  在没有实验之前,我想当然的认为它是不是根据枚举的int型字段来计算的(因为一般枚举都是一个int型,一个string型),但是转念一想,万一枚举没有int型字段呢,万一有多个int型字段呢,所以肯定不是这样的,下面看实验吧。
  定义两个枚举类,一个枚举类有一个int型属性,一个string型属性,另外一个枚举类只有一个string属性:publicenumSexEnum{MALE(1,男),FEMALE(0,女);privateinttype;privateStringname;SexEnum(inttype,Stringname){this。typetype;this。namename;}}publicenumSex1Enum{MALE(男),FEMALE(女);privateStringname;Sex1Enum(Stringname){this。namename;}}
  然后编写一个测试类,并且让两个枚举switch的FEMALE和MALE对应的返回值不同:publicclassSwitchTest{publicintenumSwitch(SexEnumsex){switch(sex){caseMALE:return1;caseFEMALE:return2;default:return3;}}publicintenum1Switch(Sex1Enumsex){switch(sex){caseFEMALE:return1;caseMALE:return2;default:return3;}}}
  将这几个类反编译下:SexEnum。classpublicenumSexEnum{MALE(1,男),FEMALE(0,女);privateinttype;privateStringname;FF:syntheticfieldprivatestaticfinalSexEnum〔〕VALUESnewSexEnum〔〕{MALE,FEMALE};privateSexEnum(intvar3,Stringvar4){this。typevar3;this。namevar4;}}Sex1Enum。classpublicenumSex1Enum{MALE(男),FEMALE(女);privateStringname;FF:syntheticfieldprivatestaticfinalSex1Enum〔〕VALUESnewSex1Enum〔〕{MALE,FEMALE};privateSex1Enum(Stringvar3){this。namevar3;}}
  反编译这两个枚举类,发现其中多了一个VALUES数组,内部包含了所有的枚举值。继续反编译测试类:SwitchTest1。classimportcom。example。express。test。Sex1Enum;importcom。example。express。test。SexEnum;FF:syntheticclassclassSwitchTest1{FF:syntheticfieldstaticfinalint〔〕SwitchMapcomexampleexpresstestSexEnum;FF:syntheticfieldstaticfinalint〔〕SwitchMapcomexampleexpresstestSex1Enumnewint〔Sex1Enum。values()。length〕;static{try{SwitchMapcomexampleexpresstestSex1Enum〔Sex1Enum。FEMALE。ordinal()〕1;}catch(NoSuchFieldErrorvar4){;}try{SwitchMapcomexampleexpresstestSex1Enum〔Sex1Enum。MALE。ordinal()〕2;}catch(NoSuchFieldErrorvar3){;}SwitchMapcomexampleexpresstestSexEnumnewint〔SexEnum。values()。length〕;try{SwitchMapcomexampleexpresstestSexEnum〔SexEnum。MALE。ordinal()〕1;}catch(NoSuchFieldErrorvar2){;}try{SwitchMapcomexampleexpresstestSexEnum〔SexEnum。FEMALE。ordinal()〕2;}catch(NoSuchFieldErrorvar1){;}}}
  首先生成了一个名为SwitchTest1。java的链接类,里面定义了两个枚举数组,这两个数组元素添加的顺序完全和测试类中switch类调用的顺序一致。
  枚举元素在数组中的下标由ordinal()函数决定,该方法就是返回枚举元素在枚举类中的序号。面试宝典:https:www。yoodb。com
  这里我们其实就已经知道了,在switch语句中,是根据枚举元素在枚举中的序号来转变成int型的。最后再看下测试类的反编译结果验证下:SwitchTest。classimportcom。example。express。test。Sex1Enum;importcom。example。express。test。SexEnum;importcom。example。express。test。SwitchTest。1;publicclassSwitchTest{publicintenumSwitch(SexEnumvar1){switch(1。SwitchMapcomexampleexpresstestSexEnum〔var1。ordinal()〕){case1:return1;case2:return2;default:return3;}}publicintenum1Switch(Sex1Enumvar1){switch(1。SwitchMapcomexampleexpresstestSex1Enum〔var1。ordinal()〕){case1:return1;case2:return2;default:return3;}}}三、String类型是咋变成int类型的?
  首先我们先知道char类型是如何变成int类型的,很简单,是ASCII码,例如存在switch语句:publicintcharSwitch(charc){switch(c){casea:return1;caseb:return2;default:returnInteger。MAXVALUE;}}
  反编译结果为:publicintcharSwitch(charvar1){switch(var1){case97:return1;case98:return2;default:returnInteger。MAXVALUE;}}
  那么对于String来说,利用的就是hashCode()函数了,但是两个不同的字符串hashCode()是有可能相等的,这时候就得靠equals()函数了,例如存在switch语句:publicintstringSwitch(Stringss){switch(ss){caseABCDEa123abc:return1;caseABCDFB123abc:return2;casehelloWorld:return3;default:returnInteger。MAXVALUE;}}
  其中字符串ABCDEa123abc和ABCDFB123abc的hashCode是相等的,反编译结果为:publicintstringSwitch(Stringvar1){bytevar31;switch(var1。hashCode()){case1554135584:if(var1。equals(helloWorld)){var32;}break;case165374702:if(var1。equals(ABCDFB123abc)){var31;}elseif(var1。equals(ABCDEa123abc)){var30;}}switch(var3){case0:return1;case1:return2;case2:return3;default:returnInteger。MAXVALUE;}}
  可以看到它引入了局部变量var3,对于hashCode相等情况通过equals()方法判断,最后再判断var3的值。四、它们的包装类型支持吗?
  这里以Integer类型为例,Character和Byte同理,例如存在switch语句:publicintintegerSwitch(Integerc){switch(c){case1:return1;case2:return2;}return1;}
  反编译结果为:publicintintegerSwitch(Integervar1){switch(var1。intValue()){case1:return1;case2:return2;default:return1;}}
  可以看到,是支持包装类型的,通过自动拆箱解决。
  那万一包装类型是NULL咋办,首先我们知道swtich的case是不给加null的,编译都通不过,那如果传null呢?
  答案是NPE,毕竟实际还是包装类型的拆箱,自然就报空指针了。

零售新时代,实体门店如何掘金即时零售?行为改变专家、NLP大师级实践者安迪拉梅奇在其知名著作《即时满足:让人嗨起来的动机心理学》中对棉花糖实验提出全新见解,为即时满足正名。他指出,即时满足就是要尽早满足自己的要求。……比亚迪元PLUS海豹海豚正式进入日本市场,三个理由会大卖前言:7月21日,比亚迪股份有限公司日本分公司在东京召开发布会,宣布正式进入日本乘用车市场,并且推出了元PLUS、海豚和海豹三款车。三款车型都是定位纯电动汽车,其中,比亚迪元P……京东总裁徐雷接替刘强东,网友满满的社会气息,以后还会买吗?刘强东套现身退的事情,想必大家都知道了吧,而由谁来接替他,也被大家所关注,如今这也已经不是什么秘密了,接替的人为京东总裁徐雷,当大家看到这个人的面相和风格之后,立刻就感受到了满……何建明戈壁深处有对甜咸孪生湖烈日炎炎之中,我想去拥抱雪山因为那一定太惬意终于到了新疆。意外的是,走到天山北边辽阔的准噶尔戈壁沙漠盆地上才发现,这里除了乱石飞滚的戈壁和一望无际的大沙滩外,根本见不着任……多次常规赛MVP至少六次进总决赛,库里成历史第八人在今日的西部决赛中,勇士主场120110大胜独行侠,大比分41淘汰对手,晋级总决赛。赛后NBA宣布,勇士后卫斯蒂芬库里获得首届西部决赛MVP奖杯。库里在本次西部决赛……您知道马踏飞燕吗?关于中国旅游标志您知道中国旅游标志是什么吗?可能有多半人是不知道的再问这知道的少数人,您知道它来自哪里吗?何地出土吗?可能又会有多半人数被问住。铜奔马马踏飞燕当图片出现……日村水总管空调开一夜要用多少电?夏至过后,气温是越来越高了,很多人都在感叹空调已经到整夜都得开的地步了。但是也有一部分人秉持着勤俭节约的原则,选择了空调的定时模式,然后在下半夜被热醒。那整夜开空调耗电量是多少……人体为何要以星换斗易筋经中医趣味故事(5)导读:少林易筋经源于生活实践,与中医有着深刻的渊源,本篇文章,我们来讲讲少林易筋经一式动作摘星换斗的中医小故事。北斗七星去西安旅游时,导游会告诉你西安古称长安,又叫……为何人到中年,鼻毛总是往外窜?这是暗示了什么?早知早受益鼻毛是人体毛发的一种,起到保护鼻腔粘膜,湿润鼻腔的作用,鼻毛的存在,能够很好的阻挡细菌和灰尘的入侵,降低鼻腔炎症的发生率。夏方养生指南正所谓存在即合理,鼻毛的存在一定有它……大户型选什么路由器?2022年Mesh路由器选购推荐本内容来源于什么值得买APP,观点仅代表作者本人作者:进击的德莱文对大户型、楼房、别墅甚至是公司的来说,解决WiFi的覆盖率是一个头疼的问题。无论路由器放在哪个位置,总有……FAN动态丨和爱豆学发型韩国女爱豆的造型变化之快,一向是女孩子们争相模仿的潮流风向标。今天就看看女爱豆的夏季流行发型参考吧。金艺琳夏天披头散发也太热了,麻花辫在发型中属于固定头发比较牢固的……55岁王志文老得真快,穿一身黑老态尽显,同框儿子不像父子像爷男人的帅气有很多种,男人只有在成为一个真正的爸爸后才会变得更具魅力,加上同样帅气的孩子,就会变得帅上加帅。之前,王志文的新片在上海上映的时候,王志文和14岁的儿子王冠杰一……
别眨眼!带你看古城大同最美的秋天黄河新闻网大同讯古都大同不仅历史悠久、文化浓厚、四季分明。当秋的脚步慢慢靠近时,随之而来的除了习习微风,还有那悄悄换上黄色新衣的叶子。这一抹抹藏于各种不同树叶上的黄,将大同秋天……钱志亮一个孩子童年最大的幸福是被允许做这4件无用的事养育孩子,我们难免功利。买很多名著,是希望孩子作文写得好;报兴趣班,是为了不让孩子输在起跑线上;学才艺,是想看对升学有没有帮助;我们希不希望孩子做一件事……CBA赛程辽宁本钢VS山东高速,新闻排名积分榜GBSPORTS虽然刘志轩、高诗妍等人离队,但辽宁男篮的主力格局并没有改变,这意味着下赛季夺冠大热门仍将是辽宁队。今年夏天,辽篮同时引进了五名球员,分别是张晨曦、米爱丽、张俊昊……高库存堡垒攻坚记山东海化销售分公司降低纯碱库存纪实金色时节,正是收获的季节。9月底,山东海化销售分公司传来喜讯:当月纯碱销售实现31。67万吨,纯碱库存由月初的9。38万吨骤降到3。27万吨,取得了良好的销售效益。……洗完脸之后别着急用水,这样做,保湿效果更好洗脸护肤是很多女性每天都要做的事情,很多人觉得只要我每天认真护肤,肌肤就会水润饱满,可实际上就算护肤再认真,依然可能肌肤问题不断,尤其是换季时节,肌肤常出现缺水干燥的问题。想要……女人40岁后防衰老,内调很重要!做好4件事,或许强过用化妆品健康科普大赛很多女性都害怕衰老,因为随着年龄的增长,皱纹,斑点都会悄悄爬上你的眼角,眉梢,在你脸上留下印记,让你娇嫩的脸庞失去了光彩。所以为了延缓衰老的到来,不少女性甚至……自由之刃新手攻略星斗篇自由之刃是一款复古传奇手游,三端互通。今天要给大家介绍的是,自由之刃星斗森林干货攻略。星斗森林有许多魂兽,风尾鸡冠蛇、地穴魔蛛、大地蝎王、暗魔邪神虎等等,年限也不同,掉落……散文随笔洗澡一丝清凉滑过肌肤,轻柔的滑动抚触,突然就让世界安静下来,闭上眼,贪婪的享受那一丝丝的滑动,一阵一阵的荡涤,灵魂顿时的全释放,肌肤以至身心灵的彻底虚空,让赤裸裸的身躯尽情享受水的……土楼长城玻璃栈道齐聚,浙江这处景点旧貌换新颜,成打卡胜地奉化的宁波湾因为沙滩和花海,成为宁波市的新晋网红景点,前往游玩的人多不胜数。宁波湾的附近还有一个老牌风景区,经过改造和提升,增加了不少新的景观,现在旧貌换新颜,再次成为热门打卡……iPhone14ProMax续航体验实测,息屏显示竟然这么费去年一整年,我都在使用iPhone13Pro作为我的主力设备,满血版A15仿生芯片、3倍长焦镜头、ProMotion自适应刷新率等硬件参数,几乎满足了我对于手机的一切需求。硬要……曝光红米Note12Pro新机,红米Note11价格悬崖式下在千元机市场中,我们不得不提红米,它也推出了K系列和Note系列等多款性价比产品,并且深受用户的喜爱,最近红米又爆料出一款千元机,那就是下半年的红米Note12系列,其中最受关……CBA最新积分榜丨辽宁5连胜锁定第一,广东重回第五,新疆奋起2022年3月18日,CBA常规赛第36轮结束最后四场较量,辽宁战胜上海拿到五连胜,最后两轮对阵江苏和四川,辽宁男篮实际上已经锁定常规赛第一。广东胜宁波,排名重新回到第五……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网