欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java中switch關(guān)鍵字的原理是什么

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

創(chuàng)新互聯(lián)公司是專業(yè)的高淳網(wǎng)站建設(shè)公司,高淳接單;提供網(wǎng)站制作、成都做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行高淳網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

Switch語法

switch作為Java內(nèi)置關(guān)鍵字,卻在項(xiàng)目中真正使用的比較少。關(guān)于switch,還是有那么一些奧秘的。

要什么switch,我有if-else

確實(shí),項(xiàng)目中使用switch比較少的一個(gè)主要原因就在于它的作用能被if-else代替,況且switch對類型的限制,也阻礙了switch的進(jìn)一步使用。

先看看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在設(shè)計(jì)的時(shí)候,是有一定的性能差別的。

看代碼:

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

結(jié)果如下:

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

這里面省略一些代碼。

可以發(fā)現(xiàn),switch是通過lookupswitch指令實(shí)現(xiàn)。那么lookupswitch指令是干嘛的呢?

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

switch可以被編譯為兩種指令

lookupswitch:當(dāng)switch的case比較稀疏的時(shí)候,使用該指令對int值的case進(jìn)行一一比較,直至找到對應(yīng)的case(這里的查找,可以優(yōu)化為二分查找)  tableswitch:當(dāng)switch的case比較密集的時(shí)候,使用case的值作為switch的下標(biāo),可以在時(shí)間復(fù)雜度為O(1)的情況下找到對應(yīng)的case(可以類比HashMap)

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

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

現(xiàn)在,我們應(yīng)該能夠明白,為什么switch關(guān)鍵字會(huì)有類型限制了,因?yàn)?switch所被翻譯的關(guān)鍵字是被限制為int類型的,至于為什么是int,我猜應(yīng)該是基于性能和實(shí)現(xiàn)的復(fù)雜度的考量吧。

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進(jìn)行反編譯得到如下代碼:

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來進(jìn)行選擇的,也就是本質(zhì)上還是int.為什么String可以這樣干?這取決于String是一個(gè)不變類。

為了防止hash碰撞,代碼更加保險(xiǎn)的進(jìn)行了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進(jìn)行反編譯得到如下代碼:

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更加簡單,直接通過枚舉的順序即可作為相關(guān)case

總之:

switch的設(shè)計(jì)按道理來說,是比if-else要快的,但是在99.99%的情況下,他們性能差不多,除非case分支量巨大,但是在case分支過多的情況下,一般應(yīng)該考慮使用多態(tài)重構(gòu)了。

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

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

分享名稱:Java中switch關(guān)鍵字的原理是什么
分享網(wǎng)址:http://aaarwkj.com/article20/iggico.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、商城網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司、服務(wù)器托管、ChatGPT、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
成人福利网站午夜一区| 国产精品1区2区久久久| 美女午夜福利一区二区| 99精品午夜福利在线| 好狼色欧美激情国产区| 91桃色午夜福利视频| 黄色免费av片在线观看| 99久久精品国产熟女| 国产精品日韩一区视频| 最新国产毛片久热精品视频| 伊在人天堂亚洲香蕉精品区| 亚洲一区二区三区黄色| 18禁污污网站国产| 亚洲天堂精品日韩电影 | 六十路人妻一区二区三区| 久久碰国产一区二区三区| 久久99热婷婷精品一区| 五月婷婷色综合激情五月| 精品女同一区二区三区网站| 日韩欧美精品在线观看免费| 亚洲欧美精品专区极品| 色婷婷av一区二区三| 久久亚洲中文字幕丝袜长腿 | 国产精品国产三级国产av丨| 青青草日韩欧美在线观看| 久久综合伊人欧美精品| 成人性生交大片免费男同| 国产美女被狂操到高潮| 激情四射五月天亚洲婷婷| 中文字幕av在线日韩| 美女丝袜诱惑国产在线观看| 久久亚洲av电影网站| 亚洲精品一区二区三区三州| 日本一区二区三区中文字幕不卡 | 亚洲成人精品免费观看| 激情影院在线观看福利| 日本色网一区二区三区四区| 日本东京一区二区三区| 久久久久久亚洲精品人妻| 中文字幕久久亚洲一区| av在线免费观看大全|