if ... else的簡寫如下


variable  = 

(condition) ? statment1 : statment2


condition 是條件式
statement1 是當條件成立時執行
statement2 是不成立時執行

c = ( a > b ) ? 1 : 2

這裡C賦值1
相當於

if( a > b ) { c = 1; }
else         { c = 2; }


 

=============================================================================================================

出處下面, 寫得太好我只是備份

http://www.jackforfun.com/2008/09/java-if-else-pk-switch.html

今天要介紹的是之前在公司 Code Review 探討過的一個問題,if-else 跟 switch 誰快?不囉唆,直接公佈答案:大部分情況 switch 快,但絕少部份 if 快

switch 判斷的方式類似 HashMap,採用 Binary Tree 的方式,當有 8 個 case 時,最少需要判斷3 次才能找到要執行的區段,因為 2^3=8。這可能因為 Compiler 不同有不同的最佳方式,我用的是 JDK 1.4,推論是這樣。

但 if 就是從頭開始判斷,如果第一個條件就 match 到,那速度就超快的,即使後續有 n 個 if-else 都無所謂了。

所以結論就是如果已經知道非常大部分都會落在某一個選項,採用 if 的方式,把最常發生的選項放在 if 的第一個,保證速度最快。但如果每一個選項都有一定的機率會被判斷到,採用 switch 會是比較保險的選擇。

驗證的程式如下,第一個是 switch。

 1:  public static void caseSwitch(int a) {
 2:   long s = System.currentTimeMillis();
 3:   for (int i = 0; i < 100000000; i++) {
 4:    switch (a) {
 5:     case 3 :
 6:      break;
 7:     case 5 :
 8:      break;
 9:     case 7 :
10:      break;
11:     case 2 :
12:      break;
13:     case 6 :
14:      break;
15:     case 4 :
16:      break;
17:     case 1 :
18:      break;
19:     default :
20:      break;
21:    }
22:   }
23:   long e = System.currentTimeMillis();
24:   System.out.println("Switch Cost: " + (e - s));
25:  }

 

第二個是 if。

 

 1:  public static void caseIf(int a) {
 2:   long s = System.currentTimeMillis();
 3:   for (int i = 0; i < 100000000; i++) {
 4:    if (a == 3) {
 5:    } else if (a == 5) {
 6:    } else if (a == 7) {
 7:    } else if (a == 2) {
 8:    } else if (a == 6) {
 9:    } else if (a == 4) {
10:    } else if (a == 1) {
11:    }
12:   }
13:   long e = System.currentTimeMillis();
14:   System.out.println("If Cost: " + (e - s));
15:  }

 

當傳入的數值落在 if 跟 switch 的最後一個選項時,if 比較慢。

caseSwitch(1); // --> Switch Cost: 328
caseIf(1); // --> If Cost: 532

當傳入的數值落在 if 跟 switch 的第一個選項時,if 變得比較快了。

caseSwitch(3); // --> Switch Cost: 422
caseIf(3); // --> If Cost: 297

實際比較起來,執行一億次差不到半秒鐘,雖然說各有優勢,但優勢實在太小了,等有寫到十億次、一兆次的程式再來考慮就好,平常跑個幾千次的就隨便用了啦,差別實在太小了。

 

PS:有人會說那換成 char 會不會有所不一樣, 有空的人可以去測測看,我測試的結論是一樣。

 

arrow
arrow
    全站熱搜

    阿肯 發表在 痞客邦 留言(0) 人氣()