91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中switch關鍵字的原理是什么

發布時間:2021-06-23 15:21:42 來源:億速云 閱讀:285 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關Java中switch關鍵字的原理是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

Switch語法

switch作為Java內置關鍵字,卻在項目中真正使用的比較少。關于switch,還是有那么一些奧秘的。

要什么switch,我有if-else

確實,項目中使用switch比較少的一個主要原因就在于它的作用能被if-else代替,況且switch對類型的限制,也阻礙了switch的進一步使用。

先看看switch的語法:

switch(exp){ case exp1:  break; case exp2:  break; default:  break;}

其中exp的類型限制為:byte ,short , int , char,及其包裝類,以及枚舉和String(JDK1.7)

為什么要有這些限制?

如果說,switch的功能和if-else的一模一樣,那么它存在的意義在哪里?

答案是:switch和if-else在設計的時候,是有一定的性能差別的。

看代碼:

public class Test { public static void switchTest(int a) {  switch (a) {   case 1:    System.out.println("1");    break;   case 2:    System.out.println("2");    break;   default:    System.out.println("3");    break;  } }}

javap -c Test.class

結果如下:

public static void switchTest(int); Code:  0: iload_0  1: lookupswitch { // 2      1: 28      2: 39    default: 50   }    ...

這里面省略一些代碼。

可以發現,switch是通過lookupswitch指令實現。那么lookupswitch指令是干嘛的呢?

在Java se8文檔中的描述可以大概知道:

switch可以被編譯為兩種指令

lookupswitch:當switch的case比較稀疏的時候,使用該指令對int值的case進行一一比較,直至找到對應的case(這里的查找,可以優化為二分查找)  tableswitch:當switch的case比較密集的時候,使用case的值作為switch的下標,可以在時間復雜度為O(1)的情況下找到對應的case(可以類比HashMap)

并且文檔中還有一段描述:

Java虛擬機的tableswitch和 lookupswitch指令僅對int數據有效。因為對 byte,char或或short值的操作在內部被提升為int,所以對其switch表達式求值為其中一個類型進行編譯,就好像它被計算為要鍵入一樣int。如果 chooseNear方法是使用type編寫的,則使用類型時 short將生成相同的Java虛擬機指令int。其他數字類型必須縮小到類型int 以便在a中使用switch。

現在,我們應該能夠明白,為什么switch關鍵字會有類型限制了,因為 switch所被翻譯的關鍵字是被限制為int類型的,至于為什么是int,我猜應該是基于性能和實現的復雜度的考量吧。

int之外的類型

我們明白了byte,shor,char,int能被作為switch類型后,再看看枚舉和String

public static void switchTest(String a) {  switch (a) {   case "1":    System.out.println("1");    break;   case "2":    System.out.println("2");    break;   default:    System.out.println("3");    break;  } }

編譯生成Test.class。拖入IDEA進行反編譯得到如下代碼:

public static void switchTest(String a) {  byte var2 = -1;  switch(a.hashCode()) {  case 49:   if (a.equals("1")) {    var2 = 0;   }   break;  case 50:   if (a.equals("2")) {    var2 = 1;   }  }  switch(var2) {  case 0:   System.out.println("1");   break;  case 1:   System.out.println("2");   break;  default:   System.out.println("3");  } }

可以看見,JDK7 所支持的String類型是通過獲取String的hashCode來進行選擇的,也就是本質上還是int.為什么String可以這樣干?這取決于String是一個不變類。

為了防止hash碰撞,代碼更加保險的進行了equals判斷。

再來看看Enum

public static void switchTest(Fruit a) { switch (a) {  case Orange:   System.out.println("Orange");   break;  case Apple:   System.out.println("Apple");   break;  default:   System.out.println("Banana");   break; }}

編譯生成Test.class。拖入IDEA進行反編譯得到如下代碼:

public static void switchTest(Fruit a) {  switch(1.$SwitchMap$com$dengchengchao$Fruit[a.ordinal()]) {  case 1:   System.out.println("Orange");   break;  case 2:   System.out.println("Apple");   break;  default:   System.out.println("Banana");  } }

可以看到,枚舉支持switch更加簡單,直接通過枚舉的順序即可作為相關case

總之:

switch的設計按道理來說,是比if-else要快的,但是在99.99%的情況下,他們性能差不多,除非case分支量巨大,但是在case分支過多的情況下,一般應該考慮使用多態重構了。

switch雖然支持byte,int,short,char,enum,String但是本質上都是int,其他的只是編譯器幫你進行了語法糖優化而已。

關于Java中switch關鍵字的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

靖江市| 平果县| 雅安市| 镶黄旗| 绍兴县| 黄山市| 淮安市| 当阳市| 蒙城县| 阳泉市| 山阴县| 牟定县| 商河县| 新邵县| 霸州市| 谢通门县| 临澧县| 黄骅市| 营山县| 武乡县| 永定县| 灌阳县| 广河县| 通榆县| 周至县| 北京市| 阳曲县| 抚顺市| 德化县| 涿州市| 馆陶县| 玉屏| 淳化县| 聂荣县| 武冈市| 永顺县| 集安市| 福海县| 乡城县| 大城县| 长宁县|