精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java中的Switch是如何支持String的?為什么不支持long?

開發 后端
Java Switch 為什么就不能支持 long 類型呢,明明它跟 byte、short、int 一樣都是數值型,它又是咋支持 String 類型的呢?一起來看一下吧。

我們知道 Java Switch 支持byte、short、int 類型,在 JDK 1.5 時,支持了枚舉類型,在 JDK 1.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屬性: 

  1. public enum SexEnum {    
  2.     MALE(1, "男"),    
  3.     FEMALE(0, "女");    
  4.     private int type;   
  5.      private String name;   
  6.      SexEnum(int type, String name) {   
  7.         this.type = type;    
  8.         this.name = name;    
  9.     }   
  10.  }    
  1. public enum Sex1Enum {    
  2.     MALE("男"),    
  3.     FEMALE("女");    
  4.     private String name;     
  5.     Sex1Enum(String name) { 
  6.          this.name = name;   
  7.     }    
  8. }   

然后編寫一個測試類,并且讓兩個枚舉 switch 的 FEMALE 和 MALE 對應的返回值不同: 

  1. public class SwitchTest {   
  2.     public int enumSwitch(SexEnum sex) {    
  3.         switch (sex) {    
  4.             case MALE:    
  5.                 return 1;    
  6.             case FEMALE:    
  7.                 return 2;    
  8.             default:    
  9.                 return 3;   
  10.         }    
  11.     }   
  12.      public int enum1Switch(Sex1Enum sex) {    
  13.         switch (sex) {    
  14.             case FEMALE:    
  15.                 return 1;    
  16.             case MALE:    
  17.                 return 2;    
  18.             default:    
  19.                 return 3;    
  20.         }    
  21.     }    
  22. }   

將這幾個類反編譯下: 

  1. // SexEnum.class    
  2. public enum SexEnum {   
  3.     MALE(1, "鐢�"),    
  4.    FEMALE(0, "濂�");    
  5.    private int type;    
  6.    private String name;    
  7.    // $FF: synthetic field    
  8.    private static final SexEnum[] $VALUES = new SexEnum[]{MALE, FEMALE};   
  9.     private SexEnum(int var3, String var4) {   
  10.       this.type = var3;    
  11.       this.name = var4;    
  12.    }    
  13. }   
  14.  // Sex1Enum.class    
  15. public enum Sex1Enum {    
  16.     MALE("鐢�"),  
  17.     FEMALE("濂�");   
  18.    private String name;    
  19.    // $FF: synthetic field    
  20.    private static final Sex1Enum[] $VALUES = new Sex1Enum[]{MALE, FEMALE};    
  21.     private Sex1Enum(String var3) {    
  22.       this.name = var3;    
  23.    }   
  24.  }   

反編譯這兩個枚舉類,發現其中多了一個 $VALUES 數組,內部包含了所有的枚舉值。繼續反編譯測試類: 

  1. // SwitchTest$1.class    
  2. import com.example.express.test.Sex1Enum;  
  3. import com.example.express.test.SexEnum;    
  4. // $FF: synthetic class    
  5. class SwitchTest$1 {   
  6.     // $FF: synthetic field    
  7.    static final int[] $SwitchMap$com$example$express$test$SexEnum;    
  8.    // $FF: synthetic field    
  9.    static final int[] $SwitchMap$com$example$express$test$Sex1Enum = new int[Sex1Enum.values().length];   
  10.     static {    
  11.       try {    
  12.          $SwitchMap$com$example$express$test$Sex1Enum[Sex1Enum.FEMALE.ordinal()] = 1 
  13.        } catch (NoSuchFieldError var4) {    
  14.          ;    
  15.       }        
  16.       try {    
  17.          $SwitchMap$com$example$express$test$Sex1Enum[Sex1Enum.MALE.ordinal()] = 2; 
  18.        } catch (NoSuchFieldError var3) {    
  19.          ;   
  20.       }    
  21.       $SwitchMap$com$example$express$test$SexEnum = new int[SexEnum.values().length];    
  22.        try {    
  23.          $SwitchMap$com$example$express$test$SexEnum[SexEnum.MALE.ordinal()] = 1;    
  24.       } catch (NoSuchFieldError var2) {    
  25.          ;    
  26.       }    
  27.        try {    
  28.          $SwitchMap$com$example$express$test$SexEnum[SexEnum.FEMALE.ordinal()] = 2;    
  29.       } catch (NoSuchFieldError var1) {    
  30.          ;    
  31.       }   
  32.     }    
  33. }   

首先生成了一個名為 SwitchTest$1.java 的鏈接類,里面定義了兩個枚舉數組,這兩個數組元素添加的順序完全和測試類中 switch 類調用的順序一致。

枚舉元素在數組中的下標由 ordinal() 函數決定,該方法就是返回枚舉元素在枚舉類中的序號。

這里我們其實就已經知道了,在 switch 語句中,是根據枚舉元素在枚舉中的序號來轉變成 int 型的。最后再看下測試類的反編譯結果驗證下: 

  1. // SwitchTest.class    
  2. import com.example.express.test.Sex1Enum;    
  3. import com.example.express.test.SexEnum;    
  4. import com.example.express.test.SwitchTest.1;   
  5. public class SwitchTest {   
  6.    public int enumSwitch(SexEnum var1) {   
  7.        switch(1.$SwitchMap$com$example$express$test$SexEnum[var1.ordinal()]) {    
  8.       case 1:    
  9.          return 1;    
  10.       case 2:    
  11.          return 2;    
  12.       default:    
  13.          return 3;    
  14.       }    
  15.    }    
  16.    public int enum1Switch(Sex1Enum var1) {    
  17.       switch(1.$SwitchMap$com$example$express$test$Sex1Enum[var1.ordinal()]) {    
  18.       case 1:    
  19.          return 1;  
  20.        case 2:    
  21.          return 2;  
  22.        default:    
  23.          return 3;    
  24.       }    
  25.    }    
  26. }   

三、String 類型是咋變成 int 類型的?

首先我們先知道 char 類型是如何變成 int 類型的,很簡單,是 ASCII 碼,例如存在 switch 語句:

 

  1. public int charSwitch(char c) {    
  2.     switch (c) {    
  3.         case 'a':    
  4.             return 1;   
  5.         case 'b':    
  6.             return 2;    
  7.         default:    
  8.             return Integer.MAX_VALUE;    
  9.     }    
  10. }   

反編譯結果: 

  1. public int charSwitch(char var1) {    
  2.     switch(var1) { 
  3.          case 97:    
  4.             return 1;    
  5.         case 98:    
  6.             return 2;    
  7.         default:    
  8.             return Integer.MAX_VALUE;    
  9.     }    
  10. }   

那么對于 String 來說,利用的就是 hashCode() 函數了,但是 兩個不同的字符串 hashCode() 是有可能相等的,這時候就得靠 equals() 函數了,例如存在 switch 語句: 

  1. public int stringSwitch(String ss) {   
  2.     switch (ss) {    
  3.         case "ABCDEa123abc":    
  4.             return 1;    
  5.         case "ABCDFB123abc":    
  6.             return 2;    
  7.         case "helloWorld":   
  8.             return 3;    
  9.         default:    
  10.             return Integer.MAX_VALUE;    
  11.     }    
  12. }   

其中字符串 ABCDEa123abc 和 ABCDFB123abc 的 hashCode 是相等的,反編譯結果為: 

  1. public int stringSwitch(String var1) {    
  2.    byte var3 = -1;    
  3.    switch(var1.hashCode()) {    
  4.        case -1554135584:    
  5.           if(var1.equals("helloWorld")) {  
  6.              var3 = 2;    
  7.           }    
  8.           break;    
  9.        case 165374702:    
  10.           if(var1.equals("ABCDFB123abc")) {    
  11.              var3 = 1;    
  12.           } else if(var1.equals("ABCDEa123abc")) {    
  13.              var3 = 0;    
  14.           }    
  15.    }    
  16.    switch(var3) {   
  17.        case 0:    
  18.           return 1;    
  19.        case 1:    
  20.           return 2;    
  21.        case 2:    
  22.           return 3;    
  23.        default:    
  24.           return Integer.MAX_VALUE;    
  25.    }    
  26. }   

可以看到它引入了局部變量 var3,對于 hashCode 相等情況通過 equals() 方法判斷,最后再判斷 var3 的值。

四、它們的包裝類型支持嗎?

這里以 Integer 類型為例,Character 和 Byte 同理,例如存在 switch 語句: 

  1. public int integerSwitch(Integer c) {    
  2.     switch (c) {    
  3.         case 1:    
  4.             return 1; 
  5.          case 2:    
  6.             return 2;    
  7.     }    
  8.     return -1;    
  9. }   

反編譯結果為: 

  1. public int integerSwitch(Integer var1) {    
  2.     switch(var1.intValue()) {    
  3.         case 1:    
  4.             return 1;    
  5.         case 2:    
  6.             return 2;    
  7.         default:    
  8.             return -1;    
  9.     }    
  10. }   

可以看到,是支持包裝類型的,通過自動拆箱解決。

那萬一包裝類型是 NULL 咋辦,首先我們知道 swtich 的 case 是不給加 null 的,編譯都通不過,那如果傳 null 呢?

答案是 NPE,畢竟實際還是包裝類型的拆箱,自然就報空指針了。

 

責任編輯:龐桂玉 來源: Java知音
相關推薦

2021-02-01 13:53:53

StringlongJava

2020-10-09 06:48:19

Pythonswitch語句

2021-10-27 07:15:36

Go 循環引用

2020-07-22 08:01:41

Python開發運算符

2021-04-20 19:23:07

語法switch-casePython

2021-12-09 10:51:47

Go繼承

2021-12-15 07:49:22

Go語言設計

2023-01-28 08:05:32

轉換Go泛型

2021-07-13 08:09:34

微博推特評論

2024-01-01 08:10:40

Go語言map

2024-05-28 08:55:52

2024-01-05 08:45:35

Go語言map

2011-12-09 20:28:50

2021-11-08 11:02:01

Go函數重載

2009-03-12 08:42:38

AndroidWMMTK

2021-06-11 00:03:31

鴻蒙智能手機

2021-08-02 09:31:20

Python工具代碼

2023-03-07 21:43:29

Java多重繼承

2021-03-02 06:03:30

Java繼承對象

2022-11-16 07:52:11

ORM鏈式GoFrame字段
點贊
收藏

51CTO技術棧公眾號

男人操女人的视频网站| 50路60路老熟妇啪啪| 亚洲av无码乱码国产麻豆| 黄色一区二区三区四区| 亚洲男人的天堂在线| 国产一二三区av| 在线观看操人| 91蜜桃视频在线| 国产在线视频欧美| a v视频在线观看| 婷婷综合亚洲| 精品小视频在线| 国产福利精品一区二区三区| 九色porny丨国产首页在线| 国产精品国产三级国产普通话三级| 91九色视频在线观看| 亚洲 欧美 成人| 这里只有精品在线| 亚洲欧美日韩另类| 秋霞午夜鲁丝一区二区| 日韩欧美另类一区二区| 一区二区三区鲁丝不卡| 亚洲福利av| 外国精品视频在线观看| 国产一区二三区| 国产精品av在线| 玖玖爱免费视频| 色97色成人| 亚洲欧美激情视频| 国产在线不卡av| 国产免费av国片精品草莓男男| 一本色道久久综合狠狠躁的推荐| 91免费国产精品| 日韩在线资源| 国产日韩一级二级三级| 九九九九九九精品| 亚洲国产成人在线观看| 狠狠色丁香久久婷婷综| 国产精品igao视频| 国产精品一区无码| 99精品国产一区二区青青牛奶| 久久人体大胆视频| 精品一区二区三孕妇视频| 果冻天美麻豆一区二区国产| 91麻豆精品国产自产在线观看一区| 97国产精东麻豆人妻电影| av免费网站在线| 国产精品美女久久久久高潮| 欧美一区二区三区电影在线观看| 欧美性受xxxx狂喷水| 国产盗摄视频一区二区三区| 亚洲综合色av| 一本大道伊人av久久综合| 日一区二区三区| 欧美孕妇毛茸茸xxxx| 亚洲国产精品午夜在线观看| 欧美精品三区| 欧美日产国产成人免费图片| 私库av在线播放| 91精品一区国产高清在线gif| 中文字幕久久久| 熟女少妇内射日韩亚洲| 动漫3d精品一区二区三区| 性猛交富婆╳xxx乱大交天津| 毛片av中文字幕一区二区| 国产精品99久久久久久人| 中文字幕精品视频在线观看| 玖玖视频精品| 国产精品福利小视频| 波多野结衣二区三区| 免费在线观看精品| 国产精品久久久久久久久久99| 伊人久久中文字幕| 久久电影国产免费久久电影| 91一区二区三区| 日本美女一级视频| 久久久久国产免费免费| 亚洲国产精品日韩| 18在线观看的| 五月开心婷婷久久| 国产成人av影视| 日韩成人在线一区| 欧美成人r级一区二区三区| 久久性爱视频网站| 国产精品一区二区99| 最近2019中文字幕在线高清| jizz亚洲少妇| 国产欧美亚洲一区| 国产精品男人的天堂| 91久久久久国产一区二区| 韩日欧美一区二区三区| 国产成人看片| 九九在线视频| 自拍偷拍亚洲欧美日韩| 僵尸世界大战2 在线播放| 伊人久久综合一区二区| 欧美日韩一区小说| 丰满人妻一区二区三区免费视频棣| 欧美三级午夜理伦三级小说| 在线日韩精品视频| 黄色一级片在线免费观看| 国产精品美女| 成人亚洲激情网| 天堂国产一区二区三区| 国产精品网友自拍| 日韩一级性生活片| 久久91导航| 欧美成人在线直播| 日本爱爱爱视频| 在线成人www免费观看视频| 国产精品久久久久久久久久东京| 国产伦精品一区二区三区免.费 | 男女污污的视频| 久久久久久爱| 亚洲图片制服诱惑| 日产精品久久久久久久| 久久福利资源站| 玛丽玛丽电影原版免费观看1977 | 国产精品无码专区av免费播放| 97久久精品人人爽人人爽蜜臀| 中文字幕成人一区| av有声小说一区二区三区| 日韩美女在线视频| 国产中文av在线| 日韩一区精品视频| 久久久亚洲综合网站| 欧美v亚洲v| 91麻豆精品国产91久久久资源速度 | 欧美一区二区三区人| 国产精品高清无码在线观看| 在线国产日韩| 97超级碰碰| 国产福利视频在线| 欧美日韩一卡二卡三卡| 亚洲精品国产91| 亚洲欧美卡通另类91av| 国产成人免费电影| 国产盗摄精品一区二区酒店| 欧美一区二区三区电影| 可以免费看av的网址| 日韩va亚洲va欧美va久久| 久久国产主播精品| 不卡视频观看| 亚洲精品美女久久久| 香蕉视频一区二区| 成人精品国产一区二区4080| av一区二区三区免费观看| 欧美另类中文字幕| 欧美日韩国产成人在线| 亚洲精品中文字幕成人片| 亚洲免费色视频| 野花视频免费在线观看| 中文av一区| 69174成人网| 日韩av毛片| 日韩av影院在线观看| av黄色在线看| 国产偷国产偷亚洲高清人白洁| 四虎永久在线精品无码视频| 狠狠色丁香婷婷综合影院| 国产精品9999| 美女av在线播放| 日韩丝袜美女视频| 国产在线观看免费av| 成年人午夜久久久| 中国丰满人妻videoshd| 精品日本12videosex| 国产日韩欧美中文| 国产淫片在线观看| 欧美tickling网站挠脚心| www日韩精品| 国产亚洲一区二区三区四区| 成人午夜激情av| 国产精品久久久久久久免费观看 | 精品久久对白| 青青草国产精品一区二区| av电影在线播放高清免费观看| 88在线观看91蜜桃国自产| 久久免费播放视频| 91美女视频网站| 日本不卡一区二区在线观看| 欧美视频在线观看| 欧美精品亚洲精品| 久久一级大片| 57pao精品| 日本三级视频在线播放| 精品99一区二区| 337p粉嫩色噜噜噜大肥臀| 亚洲色欲色欲www| 不卡一区二区在线观看| 久久精品av麻豆的观看方式| 男的插女的下面视频| 狠狠操综合网| 国产精品一区在线观看| 中文.日本.精品| 欧美极品美女电影一区| 成年在线电影| 亚洲成人免费在线视频| 伊人久久一区二区| 欧美日韩国产综合新一区| 女人18毛片毛片毛片毛片区二 | 国产精品国产精品| 伊人久久在线| 欧美夫妻性生活视频| yiren22综合网成人| 精品日韩99亚洲| 中文字幕永久在线视频| 五月天婷婷综合| 成人在线观看小视频| 久久久久99精品一区| 丰满少妇一区二区三区专区| 日本v片在线高清不卡在线观看| 国产av熟女一区二区三区| 日韩精品不卡一区二区| 久久久久久久免费| 91精品国产乱码久久久竹菊| 国产精品美女主播| 成人私拍视频| 久久久亚洲国产| 超碰免费公开在线| 中文字幕自拍vr一区二区三区| 无码国产伦一区二区三区视频| 日韩视频一区在线观看| 亚洲专区在线播放| 欧美在线你懂得| 草久久免费视频| 性欧美大战久久久久久久久| 欧美片一区二区| 亚洲色欲色欲www在线观看| 精品人体无码一区二区三区| 久久你懂得1024| 亚洲最大免费视频| 成人动漫一区二区| 91丨porny丨九色| 国内精品久久久久影院色| 亚洲成人av免费看| 性久久久久久| 欧美 国产 日本| 国产亚洲精品久久久久婷婷瑜伽| 狠狠精品干练久久久无码中文字幕 | 国产又粗又硬视频| 国产欧美一区在线| 久久久久久国产精品无码| www激情久久| 中国美女乱淫免费看视频| 99精品欧美一区| 国产精品三级在线观看无码| 94色蜜桃网一区二区三区| 丰满岳乱妇一区二区| av电影在线观看一区| 国产伦精品一区三区精东| 99久久精品99国产精品| 国产激情视频网站| 久久久久久久久一| 免费网站在线高清观看| 中文字幕av一区 二区| av黄色免费在线观看| 亚洲日本va在线观看| 日韩va亚洲va欧美va清高| 亚洲精品欧美二区三区中文字幕| 成年人视频软件| 亚洲人成人一区二区在线观看| 国产suv一区二区三区| 一区二区三区在线观看动漫| 久久精品美女视频| 色综合天天综合网天天狠天天| 无码人妻丰满熟妇区五十路| 欧美性猛交一区二区三区精品| 亚洲一区中文字幕永久在线| 欧美一级高清大全免费观看| 亚洲精品久久久狠狠狠爱| 亚洲精品一区二区在线观看| 五月婷婷在线观看视频| 国产一区二区美女视频| 黄网站app在线观看| 欧美极品少妇xxxxⅹ喷水 | 国产精品久久久久久久久粉嫩av| 亚洲ww精品| 国产亚洲情侣一区二区无| 国产欧美一区二区三区精品观看| 亚洲制服中文| 亚洲特级毛片| 黄色国产小视频| 国产精品99久久久久久宅男| 欧美xxxxx精品| 中文一区二区完整视频在线观看| 538精品在线观看| 色综合中文综合网| 国产欧美日韩综合精品一区二区三区 | 久久91亚洲精品中文字幕奶水 | 国产欧美最新羞羞视频在线观看| 精品国产一区二区三区性色av| 精品国产乱码久久久久久88av| 欧洲福利电影| 无码av天堂一区二区三区| 日韩精品福利网| 蜜臀aⅴ国产精品久久久国产老师| 国产亚洲1区2区3区| 麻豆91精品91久久久| 91国产成人在线| 成人免费一级视频| 中文字幕亚洲欧美日韩在线不卡 | 亚洲午夜在线视频| 久久久久久久久久一级| 精品99一区二区| 嫩草在线视频| 国产999精品久久久| 1204国产成人精品视频| 亚洲精品国产精品国自产| 99热精品在线| 四虎成人在线播放| 国产欧美日韩精品a在线观看| 久久久久国产精品夜夜夜夜夜| 欧美专区日韩专区| 天堂av2024| 九九热最新视频//这里只有精品| 电影在线观看一区二区| 精品久久久久久乱码天堂| 91精品国产自产在线观看永久∴| 别急慢慢来1978如如2| 不卡一区二区三区四区| 中文字幕在线有码| 欧美日韩亚洲国产综合| 久久av少妇| 欧美一区二区色| 果冻天美麻豆一区二区国产| 日本国产中文字幕| 国内一区二区视频| av黄色免费在线观看| 欧美日韩综合不卡| 福利在线视频导航| 国产69久久精品成人| 亚洲图色一区二区三区| 欧美精品一区二区性色a+v| 久久精品久久精品| 中文字幕精品亚洲| 欧美日韩五月天| 国产天堂素人系列在线视频| 欧日韩不卡在线视频| 色老板在线视频一区二区| 日韩 欧美 视频| 高清免费成人av| 久久久久久久久艹| 日韩精品一区国产麻豆| 欧美草逼视频| 国模精品娜娜一二三区| 亚洲精品韩国| 国产麻豆天美果冻无码视频| 欧美午夜丰满在线18影院| 三级理论午夜在线观看| 欧美专区国产专区| 精品国产91乱码一区二区三区四区 | 免费看91的网站| 欧美午夜视频网站| 9191在线观看| 成人疯狂猛交xxx| 综合亚洲视频| 性活交片大全免费看| 婷婷综合在线观看| 蜜桃视频在线观看网站| 国产成人一区二区在线| 久久社区一区| 人妻巨大乳一二三区| 亚洲国产综合在线| 无码精品在线观看| 国产大片精品免费永久看nba| 日本不卡电影| 樱花草www在线| 亚洲一区二区欧美激情| 丝袜+亚洲+另类+欧美+变态| 国产精品久久久久久av下载红粉 | 少妇高潮久久久久久潘金莲| 图片一区二区| 国产成人亚洲综合无码| 91尤物视频在线观看| 国产情侣免费视频| 久久成人国产精品| 欧美成人基地| 欧洲av无码放荡人妇网站| 国产日产亚洲精品系列| 一级全黄少妇性色生活片| 欧美xxxx做受欧美| 欧美变态网站| 午夜精品久久久久久久99热影院| 一区二区三区四区亚洲| 色婷婷视频在线| 国产精品视频男人的天堂| 欧美日韩亚洲一区在线观看| 熟女少妇一区二区三区| 欧美日韩视频在线观看一区二区三区 | 97久久超碰国产精品电影| 中文字幕视频二区| 久久久久久久97| 欧美色婷婷久久99精品红桃| 少妇献身老头系列| 欧美性做爰猛烈叫床潮| 免费毛片在线看片免费丝瓜视频 | 日本精品一二三区| 欧美在线免费播放| 暧暧视频在线免费观看|