2012-04-17 56 views
1

任何人都可以解釋在使用if,if elseswitch代替相似的代碼塊之間的折衷(即使可忽略不計) ?如果比較String或其他對象而不是int,情況會不同嗎?這些例子是用Java編寫的,但它是一個普遍的問題。如果vs if-else vs每個條件導致返回時切換

編輯

由於幾個答案說,一個開關將是更快,或許應該被使用,如果有以上幾個案例更多。然而,在這樣的長鏈中,沒有人對ifif else發表評論。引發這個問題的原因是我經常創建這些塊,因爲大多數情況下需要多個表達式才能使用切換器。我猜想排除else會感覺馬虎,但它並不是真的必要,所以爲什麼要包括它?

public String getValueString(int x) { 
    if (x == 1) return "one"; 
    if (x == 2) return "two"; 
    if (x == 3) return "three"; 
    if (x == 4) return "four"; 
    ... 
    return null; 
} 

VS

public String getValueString(int x) { 
    if (x == 1) return "one"; 
    else if (x == 2) return "two"; 
    else if (x == 3) return "three"; 
    else if (x == 4) return "four"; 
    ... 
    return null; 
} 

VS

public String getValueString(int x) { 
    switch(x) { 
     case 1: return "one"; 
     case 2: return "two"; 
     case 3: return "three"; 
     case 4: return "four"; 
     ... 
    } 
    return null;   
} 
+0

任何標籤的幫助,將不勝感激。 – 2012-04-17 04:19:06

+3

如果你有很多人,'switch'是要走的路。 – Mysticial 2012-04-17 04:19:42

+0

而不是返回null,返回「NaN」或「Undefined」... – 2012-04-17 04:22:25

回答

6

如果你有很多的案例,那麼switch方法是首選的方法。原因是因爲前兩個基本上需要對所有if語句進行線性搜索。所以你的案件數量是O(N)

另一方面,switch語句進行了不同的優化,可以是O(log(N))或甚至O(1)找到正確的情況。


編譯器如何能實現O(log(N))甚至O(1)

  • 對案例值的二進制搜索將允許它在O(log(N))中完成。
  • 如果萬一值足夠密集,編譯器甚至可以使用這個實例變量索引的跳轉表。在這種情況下,它是O(1)
+0

您的回答應該可能會說,_如果您有很多基於單個變量的案例_。當必須滿足多個複雜條件時,'switch'語句不能很好地工作。 – 2012-04-17 04:24:04

+0

是的,的確如此。 OP提供的例子都是單變量情況。 – Mysticial 2012-04-17 04:25:25

+0

當然,儘管您的答案應該針對任何未來的讀者(或至少嘗試)。 +1沒有更少。 – 2012-04-17 04:26:38

2

大多數編譯器將優化你的問題的例子是幾乎甚至完全一樣。因此,這個問題是可讀性問題之一。

如果你有一個或兩個的情況下,一個if聲明通常是有道理的。如果你有很多,特別是如果每​​個案例的代碼很小,那麼就代碼而言,switch聲明往往更經濟,並且可以更容易閱讀。

但是,至少在一定程度上,可讀性是個人喜好的問題。

+0

是不是他們真的只有_one_編譯器有問題(一次)? – 2012-04-17 04:29:05

+0

@ M.Babcock,我不明白這個問題。 「一次」,只有一個編譯器或沒有編譯器(就像JavaScript一樣)。你是否解釋了我所說的一次表明一次有多個編譯器? – 2012-04-17 05:35:14

2

交換機是比如果當可以使用它/ else塊更快。當有超過5個條目時,它將作爲查找來執行。這提供了有關性能的一些信息:Is "else if" faster than "switch() case"?

我相信這也是在這種情況下更具有可讀性。

+0

根據「switch」更快的說法是什麼,特別是在某個問題的背景下,對於任何一種語言都不是特定的問題?編譯器通常以不總是直觀的方式優化代碼。我會提出有些情況,'switch'語句可以產生與if語句相同的機器碼。 – 2012-04-17 05:38:22

+0

我讀過更多,當然你也寫了 - 也可以爲if-else塊做相同的優化。我已經提出了你的答案,但這些討論對未來的訪問者很有用。 – yamen 2012-04-17 05:41:49

1

對於較少的項目,if報表和switch報表之間將沒有明顯的性能差異。在switch聲明中,每個項目都是直接訪問,同一時間,因此最後一個項目將與第一個項目相同。在if訪問最後一個項目的語句將比第一個語句花費更長的時間,因爲它必須遍歷它之前的所有項目。無論如何,延遲不會像您的示例中那樣顯示較少的項目。

Here is a good discussion on this topic。看一看。

0

如果您有大量的條件類似於提供的示例中的條件,那麼我會推薦一個Map。

Map<Integer,String> map = new HashMap<Integer,String>(); 
map.put(1,"one"); 
map.put(2,"two"); 
map.put(3,"three"); 
map.put(4,"four"); 

我不確定這種交換。我會想象它的行爲類似於switch語句。它會減少代碼的圈複雜度,使其更具可讀性。