专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

面试官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,毕竟实际还是包装类型的拆箱,自然就报空指针了。

肝病不能吃核桃吗?医生提醒若想肝功好,少吃2白1黄导语肝脏是我们身体当中最大的一个消化腺,更是身体里物质能量代谢的一个中心站,而肝脏疾病是指发生在肝脏的病变,包括乙肝丙肝甲肝脂肪肝肝硬化酒精肝肝癌等。而现如今肝脏疾病更是非常常见的秋天关节疼痛肿胀,还肢体酸痛麻木?此古方能帮你解决风寒暑湿燥火六种正常的自然界气候,被古人称为六气。当人体的正气不足,抵抗力下降时,风寒暑湿燥火乘虚而入,导致人体发生疾病,这种情况下的六气,便称为六淫。由于六淫是不正之气,所以又称治疗静脉曲张就得用这三种中药,值得收藏治疗静脉曲张就得用这三种中药,值得收藏!中药是我国传统中医特有的药物,经过现代的发展,又分为中成药和中药材。经过了几千年的发展,中药的知识已经非常完备了。今天为大家介绍介绍三种中药极品飞车热度豪华版赛车游戏,画风清冷音乐燥热反差美各位观众姥爷好呀,这里是六毫秒游戏资讯姬,最新游戏资讯,就看六毫秒游戏资讯姬平时下班想玩点休闲游戏不想太累的玩家,这款游戏整个风格就很适合,网友称在冷淡风的界面和画风中,再配上燥热巫山不只有巫峡与神女,还有许多特色美食,第一餐就征服了我的胃说起巫山,几乎无人不知,但真正对它了解的却并不多,甚至昨天还有一些朋友在网上问我巫山在哪个省?,说明它真的太低调了,作为巫山人(距今约200万年前)与神女的故乡,作为长江三峡巫峡的郑国风云四个儿子一台连续剧,春秋小霸盛极而衰西周末年,幽王无道,身死国灭。平王东迁之后,周王室衰微,礼崩乐坏,各路诸侯崛起,其中,诞生了一位小霸郑庄公,郑国也成为当时的中原头牌,春秋初期最有影响力的国家。郑庄公称霸中原之时,中交建筑集团有限公司正式成立30日,中交建筑集团有限公司成立大会在京举行。中交建筑集团供图中新网9月30日电题中交建筑集团有限公司正式成立中新财经作者刘文文30日,中交建筑集团有限公司成立大会在京举行。北京市刺激消费有何用?要让老百姓敢花钱这几天无意中看到了一个专家发表的言论,我觉得非常对,需要承认的是,这次专家还真没胡说。国民经济研究所副所长王小鲁先生说消费不是刺激出来的,要让大家敢消费,而不是刺激消费。我觉得就这C罗母亲国王终将叶落归根他们父子同场竞技让我梦想成真据葡萄牙媒体报道,克里斯蒂亚诺罗纳尔多的母亲预测,她的儿子和12岁的孙子迷你罗最终将在她心爱的里斯本竞技球场同场竞技。多洛雷斯阿韦罗说,看到他们能在C罗童年时的俱乐部一起比赛,那是女篮世界杯半决赛,中国时隔28年再进世界杯半决赛在刚刚结束的女篮世界杯的半决赛争夺中,中国女篮最终以6159的成绩战胜澳大利亚,这是中国历史上第二次闯入女篮世界杯决赛,与第一次相隔了28年。在这场精彩绝伦的比赛中,王思雨罚球绝杀世界杯前夕义乌制造出口忙世界超市义乌走访见闻新华社杭州9月30日电题世界杯前夕义乌制造出口忙世界超市义乌走访见闻新华社记者夏亮方列卡塔尔世界杯还有一个多月时间才开赛,但是对于千里之外的义乌商家们来说,这场没有硝烟的战争已渐近
人人都在穿帆布鞋,怎么穿才能更时髦?帆布鞋有两个品牌自带时尚气质!VANS匡威。夏天女生一般普遍比较喜欢穿帆布鞋,相对其他鞋子比较好搭配,穿着也相对舒适。和半身裙搭配小碎花半身裙搭配百搭黑色经典帆布鞋,这样的着装会给立领长款马夹配什么?马夹,也称作坎肩,是一种能护着前后身体的衣物。它保暖且实用,深受大家的喜爱。立领长马夹,在穿着时应遵循外宽内窄上松下紧的搭配规则,就能搭出绝佳的效果。白衬衫是永远不会出错的,雪纺衬CBA最新消息曝广东锁定2米20壮汉,杜锋完成续约,周琦自我打脸广东锁定2米20壮汉北京时间3月25日,据国内最新媒体报道,广东男篮有意引进深圳弃将赵义明补强球队内线的厚度,赵义明这名内线球员其实挺不错的,有身高有吨位对付韩德君这种内线最好用了莱比锡跟队虽纳格尔斯曼下课莱默尔仍将加盟拜仁慕尼黑根据莱比锡人民报RB莱比锡跟队记者GuidoSchfer的再次确认,在纳格尔斯曼下课后他在推特上表示,莱比锡中场奥地利国脚康纳德莱默尔仍然将加盟拜仁慕尼黑。莱比锡人民报在专栏中表示国足被指打假球,13输越南调查重启,名记点名,指向国脚大鱼相信很多球迷还记得此前大年初一的那场比赛赛,当时中国男足13爆冷输给越南这个垫底的球队。一时之间,一度引起很多球迷的批评和质疑,也是从那一场比赛开始,很多球迷基本丧失了对国足的信心中国男足热身赛遭遇两连败,球迷质疑扬科维奇的执教能力中国男足在新西兰进行的两场热身赛,都以失利告终。首战02不敌新西兰U23队,次战12被黑山队逆转。这两场比赛,让球迷对国足的表现和扬科维奇的执教能力产生了质疑和不满。中国男足在这两IFAB新规门将扑点时不得干扰踢球者庆祝时间纳入补时国际足球协会理事会(IFAB)今日发布部分规则修改,实施时间为7月1日。其中关于点球的修改为门将不得以任何方式干扰踢球者,例如拖延对方踢球或触碰立柱横梁或球网等。解释门将不得做出对新生儿呈断崖式下降,专家不生孩子区别对待,你怎么看?不生孩子,活着不幸福,主要是房价闹的!试想一下,在全国各地3050万就能买一套80平方米的房子,谁不愿生三个四个?不生孩子可以多交税?生孩子不仅仅是个人行为,也是社会责任!几个方面你看过山村老尸吗?现在想想还怕不怕?别的恐怖鬼电影只有山村老尸。山村老尸山村老尸还是我表姐告诉我的我一开始以为是老师,还想着老师虽然是挺可怕的,但是有这么恐怖吗?!然后我表姐就开始给我讲剧情了虽然听的稀里糊涂的,但是中国篮协公布名单,徐杰身高劣势,为何能够碾压众人?首先可以肯定地说徐杰不是意外入选,而是众望所归。昨日新一届国家集训队16人大名单出炉,分前是赵睿周鹏任骏飞徐杰郭艾伦韩德君赵继伟张镇麟齐麟阿不都沙拉木周琦沈梓捷王哲林吴前孙铭徽胡金辽宁男篮还需要一名大外援吗?yes,辽宁去年打球就几个人,外线靠郭艾伦和赵继伟,外援基本不给力,福格还算可以吧,内线就几个人,韩德君付豪张镇麟而已,韩德君下场依旧是没有人可以顶替他的位置,今年能好点李晓旭在场
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网