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

switch是如何支持String的?為什么不支持long?

開發 后端
那么它為什么就不能支持 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。

二、枚舉類型是咋變成 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. }    
  11. public enum Sex1Enum {    
  12.     MALE("男"),    
  13.     FEMALE("女");    
  14.     private String name;   
  15.     Sex1Enum(String name) {    
  16.         this.name = name;    
  17.     }    
  18. }   

然后編寫一個測試類,并且讓兩個枚舉 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 的值。另外,關注公眾號Java技術棧,在后臺回復:面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。

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

這里以 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技術棧,在后臺回復:面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。 

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2021-01-22 15:31:47

JavaSwitchString

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語言設計

2011-12-09 20:28:50

2023-01-28 08:05:32

轉換Go泛型

2021-07-13 08:09:34

微博推特評論

2024-05-28 08:55:52

2024-01-01 08:10:40

Go語言map

2024-01-05 08:45:35

Go語言map

2009-03-12 08:42:38

AndroidWMMTK

2021-11-08 11:02:01

Go函數重載

2021-08-02 09:31:20

Python工具代碼

2021-06-11 00:03:31

鴻蒙智能手機

2009-03-11 17:32:22

聯發科WMAndroid

2014-06-05 15:16:49

Linux開源Flash

2024-03-08 08:51:59

Gomain函數
點贊
收藏

51CTO技術棧公眾號

日韩黄在线观看| 亚洲一区二区中文在线| 成人av在线天堂| 精品无码人妻一区二区三区品| 国产精品中文字幕制服诱惑| 狠狠爱在线视频一区| 色狠狠久久av五月综合| 亚洲av无码乱码在线观看性色| 欧美一级播放| 美女久久久久久久| x88av在线| 国内自拍欧美| 7777精品伊人久久久大香线蕉 | 欧美电影免费观看| 亚洲欧美另类小说视频| 欧美视频小说| 丰满岳乱妇国产精品一区| 热久久免费视频| 8x拔播拔播x8国产精品| 中文字幕在线2021| 成人免费在线播放| 精品性高朝久久久久久久| 伊人精品视频在线观看| 日本欧美一区| 精品久久久久久久久国产字幕| 尤物国产精品| av中文在线资源库| 国产精品每日更新| 久久国产一区| 欧美 日韩 国产 在线| 久久精品理论片| 日韩av高清不卡| 日本熟妇毛耸耸xxxxxx| 亚洲色图国产| 日韩在线中文字| 国产免费无遮挡吸奶头视频| 久久夜色电影| 精品女同一区二区| 红桃视频一区二区三区免费| 免费在线成人激情电影| 色综合久久久久综合体桃花网| 91免费国产精品| 在线你懂的视频| 椎名由奈av一区二区三区| 亚洲欧美日韩精品久久久| 国产三级电影在线| 国产视频在线观看一区二区三区| 精品国产综合| 天天操天天操天天操| 丁香五精品蜜臀久久久久99网站| 91香蕉亚洲精品| 国产欧美一级片| 国产精品主播直播| 亚洲综合在线播放| а√天堂资源在线| 国产成人精品免费| 国产精品区二区三区日本| 好男人在线视频www| 成人av片在线观看| 久久综合九色欧美狠狠| 欧美白人做受xxxx视频| 国产日本亚洲高清| 五月天综合网| 国产传媒在线播放| 亚洲永久免费视频| 黄色国产一级视频| 超碰一区二区| 欧美日韩国产影片| 成人性生交视频免费观看| 免费看日产一区二区三区| 欧美成人综合网站| 欧美无人区码suv| 国内成人自拍| xxxxx91麻豆| 精品少妇theporn| 亚洲欧美久久久| 国产精品偷伦免费视频观看的| 在线视频1卡二卡三卡| 国产精品2024| 快播亚洲色图| 免费在线视频欧美| 亚洲第一福利视频在线| 日韩在线第三页| 国产一区二区在线观| 亚洲爱爱爱爱爱| 美女被爆操网站| 看亚洲a级一级毛片| 亚洲第一精品福利| 欧美黄色一级生活片| 在线中文字幕第一区| 97av视频在线| 国产精品嫩草影院精东| www.久久久久久久久| 亚洲国产一区二区三区在线| av黄色在线| 色综合天天综合色综合av | 日韩精品一区二区亚洲av性色 | 亚洲黄色在线免费观看| 久久综合久久综合久久综合| 水蜜桃一区二区三区| 伊人福利在线| 在线欧美一区二区| 四虎国产精品免费| 欧美日韩在线观看视频小说| 欧美人交a欧美精品| 在线免费观看国产精品| 国产成人高清在线| 亚洲国产综合自拍| 碰碰在线视频| 欧美一级理论性理论a| 亚洲人人夜夜澡人人爽| 亚洲老妇激情| 国产精品福利在线观看网址| 内射无码专区久久亚洲| 亚洲欧洲精品一区二区精品久久久| 波多野结衣综合网| 日韩精品中文字幕吗一区二区| 国产一区二区精品丝袜| 午夜精品三级久久久有码| 国产一区二区三区久久久| 日韩高清专区| 亚洲午夜天堂| 亚洲国产精品人久久电影| 伊人在线视频观看| 蜜臀精品久久久久久蜜臀| 精品欧美日韩在线| 丁香花在线影院| 日韩欧美一级在线播放| 男女全黄做爰文章| 男人的天堂久久精品| 欧美日韩亚洲在线 | 欧美日韩激情视频| 日韩高清一二三区| 综合激情在线| 91在线精品视频| 麻豆影视在线观看_| 欧美性受极品xxxx喷水| 亚洲区自拍偷拍| 久久精品99国产精| 美女一区二区久久| 日韩久久久久久久久久久久久| 麻豆免费在线| 精品va天堂亚洲国产| 麻豆成人在线视频| 国产成人小视频| 国产资源第一页| 日韩欧美久久| 国外成人性视频| 天天操天天干天天爱| 欧美日韩亚洲国产一区 | 国产欧美日韩另类一区| 日韩a在线播放| 国产一区二区三区日韩精品 | 国色天香久久精品国产一区| 久久久av电影| 国产aⅴ爽av久久久久成人| 亚洲欧洲精品天堂一级| 欧美精品色视频| 欧美日韩网站| 国内外成人免费视频| 男人av在线播放| 亚洲视频网站在线观看| 伊人久久一区二区| 玉足女爽爽91| 中文在线观看免费视频| 日韩午夜免费| 日韩精品欧美专区| 爱情电影网av一区二区| 色综合色综合久久综合频道88| 欧美熟妇交换久久久久久分类 | 中文字幕中文在线| 亚洲视频碰碰| 欧美一卡2卡3卡4卡无卡免费观看水多多| 姬川优奈av一区二区在线电影| 综合网中文字幕| av免费观看网址| 狠狠躁夜夜躁人人躁婷婷91| 波多野结衣家庭教师在线观看 | 欧美日韩色网| 亚洲欧美另类中文字幕| 亚洲天堂999| 亚洲午夜免费电影| 美女爆乳18禁www久久久久久| 美女视频免费一区| www.毛片com| 成人免费视频网站在线观看| a√天堂在线观看| 日韩av有码| 2020国产精品久久精品不卡| av中文在线资源| 亚洲人午夜精品免费| 一级欧美一级日韩| 精品久久久久久久久久久久久久| 影音先锋制服丝袜| 成人在线一区二区三区| 午夜欧美福利视频| 亚洲午夜黄色| 亚洲黄色一区二区三区| 国内自拍欧美激情| 中文字幕永久免费| 天天综合在线视频| 欧美亚洲综合久久| 久久久久久久久久综合 | 欧美日韩裸体免费视频| 国产精品免费在线播放| 一区二区三区短视频| 欧美成人全部免费| www.黄在线观看| 亚洲国产一区自拍| 国产免费高清视频| 欧洲一区在线电影| 国产无码精品视频| 1区2区3区国产精品| 黄色aaa视频| 不卡在线视频中文字幕| 在线视频日韩欧美| 欧美96一区二区免费视频| 日韩av在线第一页| 黑人一区二区三区四区五区| 一级日韩一区在线观看| 亚洲三级网页| 狠狠色综合色区| caoporn成人免费视频在线| 国产有码一区二区| 88xx成人网| 国产成+人+综合+亚洲欧洲 | 色悠久久久久综合欧美99| 精品无码久久久久| 一区二区三区日韩精品视频| 国产日产精品一区二区三区的介绍| 国产欧美日韩综合| a天堂中文字幕| 国产日韩影视精品| 日韩毛片无码永久免费看| wwwwxxxxx欧美| 免费观看一级一片| 波多野结衣在线一区| 自拍视频第一页| 国产成人高清在线| 91九色蝌蚪porny| 丁香亚洲综合激情啪啪综合| 日本人妻一区二区三区| 成人午夜av电影| 91丨porny丨对白| 91在线小视频| 黄色工厂在线观看| 久久精品一二三| 亚洲精品色午夜无码专区日韩| 久久日一线二线三线suv| 中文字幕高清视频| 欧美国产日韩在线观看| gv天堂gv无码男同在线观看| 国产精品麻豆网站| 夫妻性生活毛片| 亚洲激情欧美激情| 国产一级片免费观看| 亚洲成av人片一区二区三区| 日韩精品一区二区av| 好吊成人免视频| 成人a v视频| 欧美日韩激情一区二区三区| 一级黄在线观看| 欧美sm美女调教| 人成在线免费视频| 色天天综合狠狠色| 中文字幕在线三区| 国内偷自视频区视频综合| 欧美电影免费观看| 91精品免费视频| 超碰精品在线观看| 欧美日韩一区在线视频| 欧美高清视频在线观看mv| 国产人妻互换一区二区| 精品91视频| 九九热免费精品视频| 日韩福利视频网| 又大又长粗又爽又黄少妇视频| 波多野结衣在线一区| www久久久久久久| 亚洲色图.com| 欧美日韩一二三四区| 欧美日韩国产电影| 熟妇人妻中文av无码| 中文字幕视频在线免费欧美日韩综合在线看 | 无码人妻一区二区三区精品视频| 91丨九色丨国产丨porny| 大吊一区二区三区| 亚洲国产精品欧美一二99| 成年人视频免费| 精品免费一区二区三区| av在线免费观看网| 国内精品小视频| 日韩美女在线| 欧美一级二级三级九九九| 亚洲国产精品日韩专区av有中文| 免费看国产一级片| 国产一区二区在线影院| av小说在线观看| 亚洲在线一区二区三区| 在线观看xxxx| 亚洲另类xxxx| 欧美日韩经典丝袜| 国产日韩欧美在线| 免费看成人吃奶视频在线| 免费看污污视频| 日本欧美在线观看| 熟妇高潮精品一区二区三区| 亚洲精品成a人| 中文字幕在线2018| 亚洲女同精品视频| heyzo高清在线| 亚洲专区国产精品| 欧美大黑bbbbbbbbb在线| 久久久噜噜噜www成人网| 国产精品一区免费在线观看| 91视频免费看片| 欧美性69xxxx肥| 高h放荡受浪受bl| 欧美另类在线观看| 高清一区二区三区av| 日本一区高清不卡| 久久精品日产第一区二区| 久久久久久久久久影视| 亚洲人成网站色在线观看| 伊人精品一区二区三区| 在线播放国产一区中文字幕剧情欧美| 性欧美xxx69hd高清| 狠狠色伊人亚洲综合网站色| 亚洲无毛电影| 国产伦精品一区二区三区88av| 亚洲欧美一区二区三区极速播放| 最近中文字幕免费观看| 一区二区三区无码高清视频| 午夜精品久久久久久久久久蜜桃| 精品欧美一区二区三区久久久| 亚洲激情社区| a天堂视频在线观看| 亚洲国产精品一区二区www在线| 99久久精品无免国产免费 | 欧美精品尤物在线| 亚洲欧美日韩精品一区二区| 日韩aaaaa| 欧美日韩国产中文精品字幕自在自线| 污污视频在线观看网站| 自产国语精品视频| 国产精品99久久久久久有的能看| 成人无码www在线看免费| 亚洲成av人在线观看| 丰满岳乱妇国产精品一区| 国色天香2019中文字幕在线观看| 黄色免费大全亚洲| 91视频 -- 69xx| 久久丝袜美腿综合| 男人草女人视频| 另类小说欧美激情| 中国一级片在线观看| 欧美一级搡bbbb搡bbbb| 牛牛精品视频在线| 狠狠色综合欧美激情| 久久精品观看| 成人午夜免费影院| 日韩欧美专区在线| 青青青免费在线视频| 青青草国产精品| 久久99国内精品| 毛片aaaaa| 亚洲女成人图区| 在线高清欧美| 日韩日韩日韩日韩日韩| 久久精品视频免费| 国产影视一区二区| 欧美极品少妇与黑人| 九一亚洲精品| 国内av一区二区| 亚洲超丰满肉感bbw| 二区在线视频| 成人动漫在线视频| 美日韩精品视频| 欧美日韩综合一区二区| 日韩av在线影院| 国产精品3区| 精品99在线视频| 亚洲美女一区二区三区| 午夜视频在线免费播放| 国产精品一区二区三| 精品二区视频| 91ts人妖另类精品系列| 亚洲精品国产精品久久清纯直播| 97精品国产综合久久久动漫日韩 | 欧美日韩成人在线| 7777kkk亚洲综合欧美网站| 久久国产精品-国产精品| 久久er99精品| 亚洲第一在线播放| 成人444kkkk在线观看| 亚洲宅男网av| 欧美极品jizzhd欧美仙踪林| 欧美日韩一级视频| 一二三四视频在线中文| 亚洲啊啊啊啊啊|