精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

95视频在线观看| 国产精品一香蕉国产线看观看| 色婷婷综合久久久久中文字幕 | 亚洲精品影视在线观看| 91香蕉视频导航| 天堂а√在线资源在线| 日本91福利区| 欧美成人中文字幕| v8888av| 精品国产美女a久久9999| 亚洲一区二区三区四区五区黄 | 国产精品久久久久久久久久久新郎 | 亚洲电影成人| 精品亚洲国产视频| 在线播放免费视频| 在线一区av| 亚洲日本在线a| 久久久久国产精品视频| 国产精品露脸视频| 亚洲视频精品| 影音先锋欧美精品| 免费欧美一级片| 日本一区免费网站| 国产精品视频yy9299一区| 国产尤物99| 国产区精品在线| 日日嗨av一区二区三区四区| 久久久精品一区二区三区| 魔女鞋交玉足榨精调教| 日韩欧美久久| 欧美精品自拍偷拍动漫精品| 亚洲欧洲日产国码无码久久99 | 欧美亚洲国产视频| 中文字幕在线有码| 国产成人1区| 精品少妇一区二区三区日产乱码 | 国产在线高清视频| 国产亚洲一区二区三区四区 | 色综合888| 国精品产品一区| 色婷婷综合久久久| 精品视频在线观看一区| 最新日本在线观看| 国产精品美女久久久久aⅴ国产馆| 51精品国产人成在线观看| 91视频在线视频| 亚洲国产1区| 欧美成人合集magnet| 91香蕉国产视频| 青青草国产免费一区二区下载 | 国产成人99久久亚洲综合精品| 精品福利av导航| 亚洲五月激情网| 亚洲狼人在线| 5858s免费视频成人| 色戒在线免费观看| 国产极品一区| 欧美人与z0zoxxxx视频| 午夜宅男在线视频| 国产亚洲精品精品国产亚洲综合| 在线看国产一区二区| 欧美视频第三页| 欧美黑人巨大xxxxx| 色噜噜狠狠色综合欧洲selulu| 少妇性饥渴无码a区免费| 中文字幕21页在线看| 日韩欧美中文字幕在线观看 | 久久久一二三| 国产精品久久久久久av福利| 日韩xxx视频| 蜜乳av一区二区三区| 91精品免费久久久久久久久| 国产精品九九九九| 国产美女精品人人做人人爽| 51成人做爰www免费看网站| 999精品国产| 国产aⅴ综合色| 狠狠色综合色区| 九色蝌蚪在线| 亚洲国产精品传媒在线观看| 伊人久久大香线蕉午夜av| 成人福利在线观看视频| 亚洲成人免费看| 97在线播放视频| 亚洲熟妇无码一区二区三区| 国产成人高清精品| 亚洲一区二区欧美激情| 精品无码一区二区三区在线| 另类专区亚洲| 欧美日韩一二三| 国产精品99精品无码视亚| 欧美尿孔扩张虐视频| 亚洲小视频在线观看| 国产成人av免费在线观看| 激情av一区| 国产精品试看| 亚洲女与黑人做爰| 日本福利视频导航| 四虎亚洲精品| 欧美日韩在线视频一区| 91麻豆精品国产| 中文字幕亚洲乱码| 欧美影院精品| 亚洲乱码av中文一区二区| 美国黄色特级片| 狠色狠色综合久久| 国产成人精品免费久久久久| 国产伦精品一区二区三区免.费| 粉嫩aⅴ一区二区三区四区五区| 在线中文字幕不卡| 99久久国产宗和精品1上映| 日本成人一区二区| 亚洲成人久久网| 网爆门在线观看| 亚洲第一网站| 91在线高清视频| 天堂在线免费av| 亚洲视频你懂的| 成人免费在线小视频| 动漫一区二区三区| 亚洲男人天堂网| 久久精品一区二区三| 日本欧美久久久久免费播放网| wwwxx欧美| 网友自拍视频在线| 色网站国产精品| 国产精品嫩草69影院| 成人在线视频免费观看| 欧美亚洲午夜视频在线观看| 中文字幕久热精品在线视频| 影音先锋男人资源在线观看| 99精品国产在热久久| 国产日韩欧美综合| 国产永久免费高清在线观看| 亚洲国产一二三| 国产欧美激情视频| 成人久久一区| 日本一本a高清免费不卡| 国产综合视频在线| 亚洲情趣在线观看| 色播五月综合网| 精品福利久久久| 5566成人精品视频免费| 蜜桃视频在线观看www| 亚洲欧美国产毛片在线| 国产色视频在线播放| 精品视频国产| 国产精品第七影院| 国产精品无码白浆高潮| 国产精品电影院| 性生活免费在线观看| 欧美日韩水蜜桃| 国产suv精品一区二区三区88区| 亚洲 欧美 激情 小说 另类| 亚洲一区二区三区四区五区中文| 欧美一区二区三区影院| 欧美1级日本1级| 亚洲一区二区三区乱码aⅴ蜜桃女| 日本在线观看视频| 3d成人动漫网站| 日本午夜在线观看| 国产精品一二三区| 男女激情免费视频| 激情亚洲另类图片区小说区| 欧美大片网站在线观看| 亚洲成人中文字幕在线| 香蕉影视欧美成人| 色噜噜在线观看| 免费永久网站黄欧美| 欧美一进一出视频| 777午夜精品电影免费看| 中文字幕日本欧美| 国产一区二区在线视频聊天| 亚洲乱码国产乱码精品精可以看| 能看毛片的网站| 国内精品久久久久久久97牛牛 | 精品免费久久久久久久| 久久久亚洲av波多野结衣| 国产韩国精品一区二区三区| 成人淫片在线看| 91网在线看| 欧美精品一区二区三区蜜桃| 99热在线观看免费精品| 国产午夜精品一区二区三区嫩草 | 亚洲精品永久www嫩草| 欧美黄页免费| 欧美黑人性生活视频| 亚洲av片一区二区三区| 欧美综合欧美视频| 国产免费一区二区三区四区| 大白屁股一区二区视频| 男人操女人免费软件| 日韩精品免费| 国产精品国产三级国产专区53| xxx性欧美| 在线日韩中文字幕| www.国产精品视频| 一本久道中文字幕精品亚洲嫩| 日本成人精品视频| 成人av午夜影院| 尤蜜粉嫩av国产一区二区三区| 91成人看片| 久久久久久国产精品一区| 91精品美女| 久久久久久香蕉网| av基地在线| 亚洲成人黄色在线| 伊人免费在线观看| 精品欧美一区二区三区| 久久久精品少妇| 91免费观看视频| 四虎1515hh.com| 日本中文在线一区| 日韩网站在线免费观看| 久久在线视频免费观看| 精品亚洲第一| 日韩在线观看一区二区三区| 国产精品99免视看9| 久久不射影院| 久久精品国产亚洲精品2020| 免费在线看v| 亚洲第一精品自拍| 国产精品亚洲欧美在线播放| 一本到一区二区三区| 精品人妻在线播放| 亚洲欧美影音先锋| 欧美另类z0zx974| 91网页版在线| 精品人妻一区二区三区日产| 日本视频在线| 日韩欧美一区视频| 日韩女优在线观看| 一区二区欧美国产| 夫妻性生活毛片| 国产精品欧美久久久久一区二区| 极品白嫩丰满美女无套| 波多野洁衣一区| 亚洲成人福利视频| 国产酒店精品激情| 成人黄色一级大片| 美腿丝袜在线亚洲一区| 中文字幕无码不卡免费视频| 夜久久久久久| 免费国产a级片| 99精品99| 两根大肉大捧一进一出好爽视频| 亚洲午夜在线| 人人妻人人澡人人爽欧美一区双 | 国产成人在线视频观看| 亚洲五月六月丁香激情| 久草网在线观看| 一区二区三区精品| 妺妺窝人体色www婷婷| 亚洲黄色尤物视频| 欧美黄片一区二区三区| 一区二区国产盗摄色噜噜| 欧美激情一区二区视频| 亚洲最大色网站| 国产一国产二国产三| 亚洲午夜久久久久久久久久久| 久久机热这里只有精品| 亚洲国产美国国产综合一区二区| 国产成年人免费视频| 天天av天天翘天天综合网| 国产a∨精品一区二区三区仙踪林| 午夜激情一区二区| 国产精品久久久久久久久久久久久久久久久| 亚洲va欧美va人人爽午夜| 久久视频免费看| 精品magnet| 亚洲欧美在线观看视频| 色综合天天综合| 免费在线不卡av| 91麻豆精品国产91久久久更新时间 | 欧美挠脚心网站| 亚洲欧美资源在线| 18免费在线视频| 另类专区欧美制服同性| heyzo在线欧美播放| 97不卡在线视频| 超碰这里只有精品| 91精品视频一区| 秋霞一区二区| 久久精品美女| 国产精品国产三级国产在线观看| 日本黄网站色大片免费观看| 青青草原免费观看| 久久久99精品免费观看不卡| 自拍偷拍第9页| 一区二区日韩av| 高清乱码免费看污| 欧美喷潮久久久xxxxx| 午夜精品久久久久久久99老熟妇| 亚洲精品动漫100p| 生活片a∨在线观看| 欧美交受高潮1| 日韩一级二级| 波多野结衣一区二区三区在线观看| 日本欧美三级| 中文字幕日韩精品久久| 亚洲精品孕妇| 国产一级片自拍| 91亚洲精品久久久蜜桃| 伊人在线视频观看| 色综合色综合色综合| 国产精品无码久久久久成人app| 日韩精品极品在线观看播放免费视频| av在线二区| 91精品国产高清久久久久久久久| 欧美91在线|欧美| 精品国产一区二区三区日日嗨 | 亚洲欧洲在线观看| 黄黄的网站在线观看| 日韩免费在线播放| 午夜久久av| 亚洲一区二区在线免费观看| 一本色道久久| 四虎国产精品永久免费观看视频| 国产清纯白嫩初高生在线观看91 | 久久午夜激情| 日本一级大毛片a一| 国产精品电影一区二区| 无码无套少妇毛多18pxxxx| 日韩欧美国产综合一区| 日本最黄一级片免费在线| 欧美一级视频在线观看| eeuss国产一区二区三区四区| 国产免费色视频| 免费成人在线影院| 国产精品揄拍100视频| 亚洲成人在线免费| av网站在线免费看| 日韩中文字在线| 国产成人精选| 日韩亚洲一区在线播放| 性高湖久久久久久久久| 国产性生活毛片| 亚洲一级不卡视频| 丰满人妻熟女aⅴ一区| 久热精品在线视频| 香蕉成人在线| 中文精品一区二区三区| 免费xxxx性欧美18vr| 99久久精品免费视频| 色婷婷久久99综合精品jk白丝| 色婷婷综合视频| 久久男人资源视频| 国产劲爆久久| 久久久久久久久久久视频| 99亚偷拍自图区亚洲| 日本亚洲色大成网站www久久| 欧美va亚洲va| av福利在线导航| 国产日韩一区二区三区| 亚洲三级观看| jizz欧美性20| 色狠狠色噜噜噜综合网| 国产在线观看免费| 国产精品一区二区3区| 久久国产亚洲精品| 青青草原国产在线视频| 一色屋精品亚洲香蕉网站| 亚洲永久精品视频| 久久精品国产亚洲7777| 日韩视频1区| 亚洲国产精品无码av| 99久久国产综合精品色伊| 二区视频在线观看| 亚洲天堂一区二区三区| 国产精品麻豆成人av电影艾秋| 一本久久a久久精品vr综合| 狠狠色丁香久久婷婷综合丁香| 男人的天堂久久久| 亚洲白虎美女被爆操| 成人av观看| 一区二区在线不卡| 国产成人免费网站| 九九热在线视频播放| 在线观看国产欧美| 国内精品视频| 国产极品在线视频| 国产欧美日韩不卡| 国产男女无套免费网站| 久久久久久久久网站| 中文字幕中文字幕精品| 在线观看免费污视频| 亚洲最新视频在线观看| 国产黄在线观看| 亚洲一区中文字幕| 一本不卡影院| 特黄一区二区三区| 精品少妇一区二区三区视频免付费 | 超碰97久久国产精品牛牛| 男人天堂1024| 成人欧美一区二区三区小说| 神马一区二区三区| 国产美女精彩久久| 日韩午夜一区| 国产精品白丝喷水在线观看| 日韩黄在线观看|