范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  我们知道Java Switch 支持byte、short、int类型,在JDK 1.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属性:  public enum SexEnum {     MALE(1, "男"),     FEMALE(0, "女");      private int type;      private String name;      SexEnum(int type, String name) {         this.type = type;         this.name = name;     } } public enum Sex1Enum {     MALE("男"),     FEMALE("女");     private String name;      Sex1Enum(String name) {         this.name = name;     } }
  然后编写一个测试类,并且让两个枚举 switch 的 FEMALE 和 MALE 对应的返回值不同:  public class SwitchTest {     public int enumSwitch(SexEnum sex) {         switch (sex) {             case MALE:                 return 1;             case FEMALE:                 return 2;             default:                 return 3;         }     }      public int enum1Switch(Sex1Enum sex) {         switch (sex) {             case FEMALE:                 return 1;             case MALE:                 return 2;             default:                 return 3;         }     } }
  将这几个类反编译下:  // SexEnum.class public enum SexEnum {     MALE(1, "男"),    FEMALE(0, "女");    private int type;    private String name;    // $FF: synthetic field    private static final SexEnum[] $VALUES = new SexEnum[]{MALE, FEMALE};      private SexEnum(int var3, String var4) {       this.type = var3;       this.name = var4;    }  }  // Sex1Enum.class public enum Sex1Enum {     MALE("男"),    FEMALE("女");    private String name;    // $FF: synthetic field    private static final Sex1Enum[] $VALUES = new Sex1Enum[]{MALE, FEMALE};      private Sex1Enum(String var3) {       this.name = var3;    }  }
  反编译这两个枚举类,发现其中多了一个 $VALUES 数组,内部包含了所有的枚举值。继续反编译测试类:  // SwitchTest$1.class import com.example.express.test.Sex1Enum; import com.example.express.test.SexEnum;  // $FF: synthetic class class SwitchTest$1 {     // $FF: synthetic field    static final int[] $SwitchMap$com$example$express$test$SexEnum;    // $FF: synthetic field    static final int[] $SwitchMap$com$example$express$test$Sex1Enum = new int[Sex1Enum.values().length];      static {       try {          $SwitchMap$com$example$express$test$Sex1Enum[Sex1Enum.FEMALE.ordinal()] = 1;       } catch (NoSuchFieldError var4) {          ;       }        try {          $SwitchMap$com$example$express$test$Sex1Enum[Sex1Enum.MALE.ordinal()] = 2;       } catch (NoSuchFieldError var3) {          ;       }        $SwitchMap$com$example$express$test$SexEnum = new int[SexEnum.values().length];        try {          $SwitchMap$com$example$express$test$SexEnum[SexEnum.MALE.ordinal()] = 1;       } catch (NoSuchFieldError var2) {          ;       }        try {          $SwitchMap$com$example$express$test$SexEnum[SexEnum.FEMALE.ordinal()] = 2;       } catch (NoSuchFieldError var1) {          ;       }     } }
  首先生成了一个名为 SwitchTest$1.java 的链接类,里面定义了两个枚举数组,这两个数组元素添加的顺序完全和测试类中 switch 类调用的顺序一致。
  枚举元素在数组中的下标由 ordinal() 函数决定,该方法就是返回枚举元素在枚举类中的序号。面试宝典:https://www.yoodb.com/
  这里我们其实就已经知道了,在 switch 语句中,是根据枚举元素在枚举中的序号来转变成 int 型的。最后再看下测试类的反编译结果验证下:  // SwitchTest.class import com.example.express.test.Sex1Enum; import com.example.express.test.SexEnum; import com.example.express.test.SwitchTest.1;  public class SwitchTest {    public int enumSwitch(SexEnum var1) {       switch(1.$SwitchMap$com$example$express$test$SexEnum[var1.ordinal()]) {       case 1:          return 1;       case 2:          return 2;       default:          return 3;       }    }     public int enum1Switch(Sex1Enum var1) {       switch(1.$SwitchMap$com$example$express$test$Sex1Enum[var1.ordinal()]) {       case 1:          return 1;       case 2:          return 2;       default:          return 3;       }    } }三、String 类型是咋变成 int 类型的?
  首先我们先知道 char 类型是如何变成 int 类型的,很简单,是 ASCII 码,例如存在 switch 语句:  public int charSwitch(char c) {     switch (c) {         case "a":             return 1;         case "b":             return 2;         default:             return Integer.MAX_VALUE;     } }
  反编译结果为:  public int charSwitch(char var1) {     switch(var1) {         case 97:             return 1;         case 98:             return 2;         default:             return Integer.MAX_VALUE;     } }
  那么对于 String 来说,利用的就是 hashCode() 函数了,但是 两个不同的字符串 hashCode() 是有可能相等的,这时候就得靠 equals() 函数了,例如存在 switch 语句:  public int stringSwitch(String ss) {     switch (ss) {         case "ABCDEa123abc":             return 1;         case "ABCDFB123abc":             return 2;         case "helloWorld":             return 3;         default:             return Integer.MAX_VALUE;     } }
  其中字符串 ABCDEa123abc 和 ABCDFB123abc 的 hashCode 是相等的,反编译结果为:  public int stringSwitch(String var1) {    byte var3 = -1;    switch(var1.hashCode()) {        case -1554135584:           if(var1.equals("helloWorld")) {              var3 = 2;           }           break;        case 165374702:           if(var1.equals("ABCDFB123abc")) {              var3 = 1;           } else if(var1.equals("ABCDEa123abc")) {              var3 = 0;           }    }     switch(var3) {        case 0:           return 1;        case 1:           return 2;        case 2:           return 3;        default:           return Integer.MAX_VALUE;    } }
  可以看到它引入了局部变量 var3,对于 hashCode 相等情况通过 equals() 方法判断,最后再判断 var3 的值。  四、它们的包装类型支持吗?
  这里以 Integer 类型为例,Character 和 Byte 同理,例如存在 switch 语句:  public int integerSwitch(Integer c) {     switch (c) {         case 1:             return 1;         case 2:             return 2;     }     return -1; }
  反编译结果为:  public int integerSwitch(Integer var1) {     switch(var1.intValue()) {         case 1:             return 1;         case 2:             return 2;         default:             return -1;     } }
  可以看到,是支持包装类型的,通过自动拆箱解决。
  那万一包装类型是 NULL 咋办,首先我们知道 swtich 的 case 是不给加 null 的,编译都通不过,那如果传 null 呢?
  答案是 NPE,毕竟实际还是包装类型的拆箱,自然就报空指针了。

赴美签证最新消息国内美国B类签证开放时间美国签证政策不断更新,最近,对于已支付的签证费用有效期(称为MRV费用)延长至2023年9月30日。这对于目前一直无法预约美国签证的伙伴是个利好,起码签证费不白交,还有将近2年的有来朝鲜旅游,女导游是怎么评价中国游客?说的挺对以人为镜,可知荣辱,这是老祖宗的箴言,中国人历来有征求他人对自己意见的习惯,特别是异性之间,那叫一看一个准。而中国游客脚步遍布世界,肯定对当地人如何看待自己很是在意。近年来朝鲜渐渐水知道答案寻找液态水,就是寻找可能的外星生命2015年9月28日,媒体广泛报道NASA宣称,火星表面存在着液态水。部分阴谋论者当即表示,这是配合10月2日公映的科幻大片火星救援进行的宣传。其实NASA的原话是这样的利用高分辨2021年诺贝尔物理学奖,授予提示世界注意气候变化的三位科学家2021年的诺贝尔物理学奖授予了三位科学家,他们的贡献是帮助人类通过大气变化了解气候变化,让人类都可以用简单通俗的方式,了解复杂的气候系统。就像我们熟知的温室效应,就是经典的大气改瑞士推出宇宙VR软件以实现三维全景的空间可视化据Telecom10月13日报道,瑞士顶尖大学洛桑联邦理工学院(EPFL)的研究人员10月12日发布了开源测试版宇宙VR软件,该软件能够虚拟访问宇宙,包括国际空间站月球土星或系外行1962年印度战败,撤退途中,侵占了尼泊尔的卡拉帕尼地区1962年中印战争爆发后,尼泊尔也在积极提防印度,不过和印度相比,尼泊尔国力弱小,还是被印度侵占了一块土地。这块土地名叫卡拉帕尼地区,位于我国,尼泊尔,印度三国的交汇地带,面积约7印度观察,印度普通人的吃喝玩乐说起印度人的生活,很多去过印度的人都觉得不可思议。印度人吃饭,直接用手抓。印度人上完厕所,直接用手指擦屁股。可以说,印度人的生活方式,颠覆了很多人的很多认知。印度人大部分很穷,但印山西一处军工厂,曾是国家保密第二坦克基地,如今破败成危楼山西这座城市向来以丰富的煤炭资源而出名,在其鼎盛时期很多人提到山西,最先想到的就是它发展的很好的煤炭产业,其实这座城市在旅游产业方面也取得一些成就。凭借着当地丰富的人文旅游资源,以实力不济面临惨败,中国男子冰球队被要求退出北京冬奥会?近日,据俄罗斯塔斯社报道,新任的国际冰球联合会主席吕克塔尔迪夫质疑中国男子冰球队的实力,表示如果中国队不能拿出令人满意的状态,北京冬奥会的参赛资格可能会被取消,由挪威队顶替。中国男04!挑战特鲁姆普失败,中国选手签运糟糕,遭遇滑铁卢球迷失落斯诺克北爱尔兰公开赛继续正赛首轮争夺,中国选手签运糟糕,连续挑战强敌,遭遇滑铁卢一场04,完败特鲁姆普,球迷非常失落截止到目前为止,仅有三人晋级32强,创造了一个尴尬成绩,颜丙涛承最新研究塑料污染危及超过半数海洋鸟类,防治已刻不容缓图片来源视觉中国文丨学术头条,作者丨XT,编审丨王新凯2018年联合国环境署发布的一项报告显示,全球每年约有1300万吨塑料废弃物流入海洋。漂浮在海面上和搁浅在海滩上的塑料在风吹日
深圳市宝安区深创投投资运营有限公司揭牌成立3月31日,宝安区携手深创投集团共同组建的深圳市宝安区深创投投资运营有限公司,在海纳百川总部大厦举办成立仪式,标志着宝安区与深创投集团战略合作迈入实质性新阶段。宝安区委常委区政府党主场逆转战胜山东男篮,强硬的广东宏远拒绝连败!千万不要打开,高清免费全球赛事都在里面大家好,我是璐璐!10293,恭喜广东宏远战胜来势汹汹的山东男篮,成功避免遭遇两连败!赛前,广东队被同城兄弟深圳队完成常规赛双杀,让球队在常规Telegram安全通讯应用还是犯罪团伙的交流工具?Telegram是一款备受争议的通讯应用,一些人认为它是一款安全的通讯工具,能够保护用户的隐私和安全但另一些人则认为,它成为了一些犯罪团伙的交流工具。其的匿名和加密特性,使得一些犯砸对方大巴,唱歌侮辱曼城与利物浦之间什么仇什么怨?英超第29轮曼城主场4比1大胜利物浦,比赛前后出现了一些不愉快的场面,利物浦主帅克洛普被球迷的投掷物砸,曼城球迷还在歌词中嘲讽了希尔斯堡惨案(1989年4月15日,在英国谢菲尔德希记者穆阿尼希望加盟拜仁,他与于帕有着很好的友谊直播吧4月1日讯据sport1记者KerryHau的消息,法兰克福前锋穆阿尼希望加盟拜仁。该记者报道称,穆阿尼希望加盟拜仁,拜仁正是穆阿尼的首选球队。穆阿尼也希望留在德甲,他对拜仁300块的香港游,坑惨多少中国人前几天,有香港网友上传了一些照片,让人看了心里很不是滋味图片中,一群头戴旅行团小红帽的内地旅游团,一字排开,或站或蹲,在土瓜湾某行人路上吃盒饭。根据香港媒体报道,这个团的餐标本来是孕妇可以擦口红吗?爱美之心人皆有之,很多女性为了有好气色包包里都会准备一支口红,但怀孕后,孕妇还能涂口红吗?重庆安琪儿妇产医院妇产医生邓沁表示,首先,无论是唇膏唇彩,还是唇蜜唇冻口红,都是由各种油脂这需要设计,更需要勇气!4月份了,天气转暖,在家里我穿着一件衬衫和单裤就可以了。妻子看到我的衬衫腋窝位置开线了,提醒了我一句。我问她能缝补一下吗,不行的话,就不穿了。妻子拿出许久不用的电动缝纫机,把衬衫开王后最爱却是英国王室的无奈,蓝宝石胸针戴在了卡米拉的身上英国王室有一件传奇珠宝,维多利亚女王爱情的象征蓝宝石胸针,英国王室代代相传,佩戴这件传世珠宝的都是国王的妻子或女王,这件珠宝最初由维多利亚女王传给了她最喜爱的儿媳亚历山德拉王后,可贵气感配饰,戴对了超出片!对于春天最大的尊重莫过于出去享受这大好的春光了!为了降低造型踩雷的可能性,很多女孩便会选择百搭的造型,但是整体看会少了些亮点。对于我们女孩来说,选好了新衣服,配饰也很重要,不求它多祝贺!斩获2金6铜,梅州五华阿哥阿妹厉害4月2日,广东省第十六届运动会竞技体育组空手道比赛在清远连州市体育中心落幕。梅州市空手道队首次参加省运会勇夺2金6铜,以总分109分的成绩,位列团体第八名。周雨婷夺得女甲48K冠军