黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 switch語句的深入解析

switch語句的深入解析

更新時間:2020-11-17 17:51:37 來源:動力節點 瀏覽1128次

switch語句是Java控制語句里面非常基礎的知識,也是老生常談的內容。switch語句的語法比較簡單,相對也容易掌握。然而,大部分人卻是知其然,不知其所以然。本文將深入去探索switch語句的用法。


首先我們看看switch 語法的基本格式:

switch (表達式) {

case 常量表達式或枚舉常量:

語句;

break;

case 常量表達式或枚舉常量:

語句;

break;

......

default: 語句;

break;

}

switch 匹配的表達式可以是:

byte、short、char、int類型及 這4種類型的包裝類型;

枚舉類型;

String 類型;

case 匹配的表達式可以是:

常量表達式;

枚舉常量;

注意一點: case提供了switch表達式的入口地址,一旦switch表達式與某個case分支匹配,則從該分支的語句開始執行,一直執行下去,即其后的所有case分支的語句也會被執行,直到遇到break語句。


看個例子體會一下:

public static void main(String[] args) {

String s = "a";

switch (s) {

case "a": //a分支

System.out.println("匹配成功1");

case "b": //b分支

System.out.println("匹配成功2");

case "c": //c分支

System.out.println("匹配成功3");

break;

case "d": //d分支

System.out.println("匹配成功4");

break;

default:

break;

}

}

運行結果:

匹配成功1

匹配成功2

匹配成功3


switch成功匹配了a分支,但a、b分支都沒有 break 語句,所以一直執行a分支后的所有語句,直到遇到c分支的break語句才終止。

接下來我們來看看編譯器對 switch表達式的各種類型的處理:

盡管 switch 支持的類型擴充了幾個,但其實在底層中,swtich 只能支持4種基本類型,其他幾個類型是通過一些方式來間接處理的,下面便是講解編譯器對擴充類型的處理。


1、對包裝類的處理

對包裝類的處理是最簡單的 —— 拆箱。看下面的例子,switch 比較的是包裝類 Byte 。

Byte b = 2;

switch (b) {

case 1:

System.out.println("匹配成功");

break;

case 2:

System.out.println("匹配成功");

break;

}

用jad反編譯一下這段代碼,得到的代碼如下:

Byte b = Byte.valueOf((byte)2);

switch(b.byteValue())

{

case 1: // '\001'

System.out.println("\u5339\u914D\u6210\u529F");

break;

case 2: // '\002'

System.out.println("\u5339\u914D\u6210\u529F");

break;

}

反編譯的代碼很簡單,底層的switch比較的是Byte通過(拆箱)方法byteValue()得到的byte值。順便說一下,這段反編譯代碼不僅揭開了 拆箱 的解析原理,也展示了 裝箱 的解析原理(第一句代碼);


2. 枚舉類型

為了簡單起見,直接采用JDK提供的枚舉類型的線程狀態類 Thread.state 類。

Thread.State state = Thread.State.RUNNABLE;

switch (state) {

case NEW:

System.out.println("線程處于創建狀態");

break;

case RUNNABLE:

System.out.println("線程處于可運行狀態");

break;

case TERMINATED:

System.out.println("線程結束");

break;

default:

break;

}

反編譯代碼:

Sex sex = Sex.MALE;

switch($SWITCH_TABLE$Test_2018_1_14$Sex()[sex.ordinal()])

{

case 1: // '\001'

System.out.println("sex:male");

break;

case 2: // '\002'

System.out.println("sex:female");

break;

}

從編譯代碼中發現,編譯器對于枚舉類型的處理,是通過創建一個輔助數組來處理,這個數組是通過一個$SWITCH_TABLE$java$lang$Thread$State() 方法創建的,數組是一個int[]類型數組,數組很簡單,在每個枚舉常量的序號所對應的數組下標位置的賦一個值,按序號大小賦值,從1開始遞增。


3、 對String類型的處理

依舊是先看個例子,再查看這個例子反編譯代碼,了解編譯器的是如何解析的。

public static void main(String[] args) {

String s = "China";

switch (s) {

case "America":

System.out.println("匹配到美國");

break;

case "China":

System.out.println("匹配到中國");

break;

case "Japan":

System.out.println("匹配到日本");

default:

break;

}

}

反編譯得到的代碼:

public static void main(String args[])

{

String s = "China";

String s1;

switch((s1 = s).hashCode())

{

default:

break;

case 65078583:

if(s1.equals("China"))

System.out.println("\u5339\u914D\u5230\u4E2D\u56FD");

break;

case 71341030:

if(s1.equals("Japan"))

System.out.println("\u5339\u914D\u5230\u65E5\u672C");

break;

case 775550446:

if(s1.equals("America"))

System.out.println("\u5339\u914D\u5230\u7F8E\u56FD");

break;

}

}


從反編譯的代碼可以看出,switch 的String變量、case 的String常量都變成對應的字符串的 hash 值。也就是說,switch仍然沒有超出它的限制,只是通過使用 String對象的hash值來進行匹配比較,從而支持 String 類型。

通過上面的例子我們不難看出,底層的switch只能處理4個基本類型的值。其他三種類型需要通過其他方式間接處理,即轉成基本類型來處理。對枚舉類型的處理,是通過枚舉常量的序號及一個數組。而對字符串String的處理,是通過 String 的hash值。本文基本上已經很全面的對switch語句的用法進行了介紹,這也是借鑒了本站的Java SE教程中的內容,教程中對其他的Java控制語句的講解也很到位,感興趣的小伙伴可以前去觀看學習。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 么公又大又硬又粗又爽小说 | 在线观看男女男免费视频 | 日本人xxxⅹ18hd18hd | 国产精品麻豆综合在线 | 成人狠狠色综合 | 久久亚洲不卡一区二区 | 成人中文字幕在线高清 | 一级一级黄色片 | 亚洲夜夜骑 | 三级黄色视屏 | 亚洲欧美卡通成人制服动漫 | 视频一区二区三区自拍 | 欧美巨大xxxx做受孕妇视频 | 成人a毛片在线看免费全部播放 | 成人午夜看片 | 伊人网综合在线视频 | 国产精品天干天干在线观看澳门 | 亚洲综合网在线观看 | 亚洲日本va午夜中文字幕 | 久久国产成人精品 | 欧美黄色小视频 | 成在线视频 | 一级黄色录像视频 | 91av中文字幕 | 国产成人精品免费视频网页大全 | 国产黑丝美女 | 日韩欧美精品综合一区二区三区 | 在线观看亚洲专区 | 一区二区三区中文字幕 | 男人深夜网站 | 性一级录像 | 免费人成大片在线观看播放 | 黄网免费在线观看 | 国产特黄特色a级在线视 | 高h辣h双处全是肉一对一 | 国产无圣光高清一区二区 | 一级特黄aaa大片在线观看视频 | 九月婷婷人人澡人人添人人爽 | 一个人看的www视频在线 | 精品国产成a人在线观看 | 国产亚洲精品线观看77 |