switch和if else語句到底用誰?

大家都知道在Java中一共有兩種選擇語句分別是switch與if語句,但究竟什麼時候用?用哪一種好呢?這一直是大家心中的一個小疑慮。

現在簡單的回顧switch與if語句的基本構造,再深入瞭解它們的使用區別。首先回顧下switch與if的基本結構

switch

說得再多,不如直接上代碼

switch和if else語句到底用誰?

上述是一個簡單的switch語句的例子,根據choose的取值不同,選擇不同的case語句執行;如果沒有匹配任何case值,則執行默認語句。

注意事項:1.choose的數據類型有一定要求:可以為byte、short、char、int、String、枚舉,當然不同的JDK版本對switch影響不同。2.choose一般建議是變量,當然也可以是常量。而case後面的值為常量,並且choose與case的值的數據類型要一致。3.還記得每個case語句後的break嗎?break表示退出此switch語句,如果沒有break,則case語句會繼續執行下去。

以上是switch比較重要的知識點,做一個簡單的回顧。

接下來回顧下if語句

if語句

if語句的樣式就比較多了。if語句分為三種:簡單if語句、雙分支if語句、多分支if語句

簡單if語句

在代碼中展示為:

switch和if else語句到底用誰?

大家可以直接從代碼中看出來,簡單if語句,也就只有if的存在,作為一個簡單的判斷,不管語句1執不執行,並不妨礙下方語句2的執行。

回顧了簡單的if語句,接下來再說說雙分支if語句

雙分支if語句

還記得什麼是雙分支if語句嗎?是在簡單if語句的基礎上添加對立的條件else語句比如下面的代碼:

switch和if else語句到底用誰?

通過條件1來判斷是否需要執行語句1,如果條件1為真,則直接執行語句1;反之為假,則執行語句2。但是不管執行語句1或者語句2,語句3都會執行

雙分支if語句中需要時刻了解其else的取值範圍。

多分支if語句

什麼是多分支if語句呢?就是在if…else的基礎上,再加入更多的條件進行選擇。

switch和if else語句到底用誰?

由於出現了一個else if,則每個判斷的取值發生了變化,但在多分支if語句中,我們雖然可以像下面的代碼一樣添加更多的else if條件,但是選中的語句只會有一個,也就是說語句1、2、3只會有一個執行,誰先執行後面的就直接無效了,但並不影響語句4的執行。

switch和if else語句到底用誰?

很多同學都已經掌握了上述的內容

接下來,來看一個不一樣的if語句

雙if語句

什麼是雙if語句呢?

switch和if else語句到底用誰?

這個代碼有點奇怪!一個代碼中竟然連續出現多個if語句,那問題來了,到底執行哪一個if語句呢?答案是:都可能會執行,每個if語句間沒有影響,不管是幾個if語句,只要滿足條件都會運行。

上述代碼,條件1和條件2沒有任何的關係,只要條件1滿足就執行語句1,只要條件2滿足就執行語句2,兩者可能都會執行,當然,也可能都不執行;但請注意語句3一定會執行。

注意:不要把雙if語句與多分支if語句傻傻分不清楚喲。

接下來進入我們的正題

switch和if else語句到底用誰

上面對switch於if else語句進行了基本結構的回顧。

從基本結構也可以看出其區別:

switch:主要是將choose中的值和某一個case值進行比較,而case值是一個確定的值。

if else:每個執行的語句前都會有一個條件,這個條件可以是類似x==0的這種匹配一個確定值的布爾表達式,也可以是x>10的這種匹配一個範圍的布爾表達式。

從它們的結構可以大致的分析出它們的用法區別,下面我們舉幾個例子來詳細的表現出它們的區別。

例子1:將一個班級按照 0-59:E級 60-69:D級 70—79:C級 80—89:B級 90-100:A級的要求對輸入的成績進行等級評判

若使用if else語句

switch和if else語句到底用誰?

而使用switch來完成該代碼呢?

switch和if else語句到底用誰?

從上面可以看出,if else語句在這道題裡用起來感覺挺順手的,而switch呢?就要複雜得多了。

我們再來看一個例子

例2:給出如下選項,並根據選項進行效果展示:輸入1:則輸出"普通攻擊";輸入2:則輸出"魔法攻擊";輸入3:則輸出"使用道具";輸入3:則輸出"逃跑";

當然,這道題更多出現在遊戲的內容中

那如果我們使用if else語句該如何書寫呢?

switch和if else語句到底用誰?

而使用switch語句呢?

switch和if else語句到底用誰?

從這個例子可以看出:switch寫起來要比if else更為簡潔,並且使用x==0這些方式寫出來,難免感覺怪怪的。

綜上兩道題可以看出:switch更適用於有確切值的選擇,而if else更適合用於進行範圍判斷的內容。

當然上述兩道題可以互相轉換,也就是說到底使用switch還是if else並沒有嚴格要求,在恰當的地方使用恰當的方法是每個程序員需要深思熟慮的。

當然我們的討論還沒有結束,上面只是從例子說明了switch與if else的區別,接下來我們從它們的執行效率上來進行講解。

switch與if else的執行效率

單從JVM的執行效率上講的話,switch的執行效率要高於if語句:

原因在於:switch語句在運行時,首先會生成一個"跳轉表"來指示實際的case分支的地址,而這個"跳轉表"的索引號與swtich中的case值是相等的,這樣的話,switch就不用像if else那樣,遍歷所有的條件,直至找到正確條件,而僅僅只需要訪問對應索引號的表項就可以到達定位分支的目的。

簡單的說,switch會生成一個數據統計表,將case後面的值全部統計起來,匹配時先拿表中的數據進行比較,如果有則直接跳轉到相應case語句;如果沒有,則直接跳轉到default語句。

那if else呢?其實剛剛我們已經簡單的說了其工作流程,這裡再次說明一下:

if else語句需要一條一條的去進行取值範圍的判斷,直到找到正確的選項位置,這樣的話勢必會浪費大量的時間。

所以,單從其運行的效率來看,switch語句要更勝一籌。

總結

這裡簡單的總結一下:

1.switch語句由於它獨特的case值判斷方式,使其執行效率更高,而if else語句呢,則由於判斷機制,導致效率稍慢。

2.到底使用哪一個選擇語句,和當前的代碼環境有關,如果是範圍取值,則使用if else語句更為快捷;如果是確定取值,則使用switch更是一個不錯的選擇。

所有好的程序都是經過不斷思考,不斷琢磨,付出努力,最終得以完成的。


分享到:


相關文章: