【问题标题】:if else or switch case [duplicate]if else 或 switch case [重复]
【发布时间】:2013-09-10 06:36:08
【问题描述】:

我需要检查一小部分逻辑,如果有人能给我一些有价值的意见,我将不胜感激。

我有两种检查逻辑的方法,想知道哪种方法更有效。

第一种方式:

if(url.equalsIgnoreCase("1")){
    url = "aaa";
}
else if(url.equalsIgnoreCase("2")){
    url = "bbb";
}
else if(url.equalsIgnoreCase("3")){
    url = "ccc";
}
else if(url.equalsIgnoreCase("4")){
    url = "ddd";
}
else if(url.equalsIgnoreCase("5")){
    url = "eee";
}
else if(url.equalsIgnoreCase("6")){
    url = "fff";
}

第二种方式:

int temp = Integer.parseInt(url);
switch (temp) {
case 1:
    url = "aaa";
    break;
case 2:
    url = "bbb";
    break;
case 3:
    url = "ccc";
    break;
case 4:
    url = "ddd";
    break;
case 5:
    url = "eee";
    break;
case 6:
    url = "fff";
    break;
}

请告诉我哪个更有效。用Integer.parseInt(string)不好吗?

【问题讨论】:

  • 为什么使用 'equalsIgnoreCase' 来比较整数?
  • @micro.pravi .. 它与您建议的链接部分重复。我主要想知道添加 Interger.parseInt() 是否会使其更有效率..所以只有我发布了一个新问题..

标签: java


【解决方案1】:

作为一般规则,switch 语句产生更有效的bytecode。对于Java 7,引入了带有String 的switch 语句,因此您不需要强制转换它。

【讨论】:

    【解决方案2】:

    请告诉我哪个更有效。

    你的情况是 switch 语句更有效

    使用 Integer.parseInt(string) 不好吗?

    没有。没关系。但是当你使用 java7 时,你可以在你的 switch case 中使用 String-constants 值,但不能在 Android 上使用。

    除了效率之外:在大多数情况下,switch 看起来更干净。

    【讨论】:

    • (但java 7还没有在android上)
    • @njzk2 标记的 java :)
    • @sᴜʀᴇsʜᴀᴛᴛᴀ : 但也标记为 android :)
    • 我知道它不在安卓上。我只想提一下它适用于 java7
    • 只是想确保阅读您的答案的人清楚这一点。 (不过,在 android 中终于有了字符串开关肯定会很好)
    【解决方案3】:

    在效率方面检查:Case vs If Else If: Which is more efficient?,但方式 2 看起来是更干净和可读的代码。

    【讨论】:

      【解决方案4】:

      对于这么长的列表,switch 声明绝对是更好的选择。相比之下,结点越长越好切断开关

      【讨论】:

        【解决方案5】:

        在这种情况下,switch 效率更高。

        其实,如果你使用Java7,你可以直接使用字符串大小写而不是使用Integer.parseInt()

        【讨论】:

          【解决方案6】:

          使用 parseInt 还不错,但是如果字符串不是整数会抛出异常。

          否则,我认为您可以自己看到这一点,开关/案例更具可读性。

          如果你的 if 构造有一个最终的 else 来捕捉所有其他情况(包括非数字字符串)

          那么你可以这样做,假设你的整数总是积极的

          int temp = -1;
          try {
              temp = Integer.parseInt(str);
          } catch (NumberFormatException ex) {
              // ignore exception and use -1 as original value for default case
          }
          

          【讨论】:

            【解决方案7】:

            如果你的值真的是 1-6,最清晰和最有效的方法是使用数组:

            String[] URLS = {...};
            url = URLS[Integer.parseInt(url) - 1];
            

            【讨论】:

            • +1 开箱即用 :)
            • 我不得不承认:顺利...但这并没有真正回答他的问题(仍然 +1)
            • 大部分答案都是正确的,但这真的是开箱即​​用的想法:)
            • 虽然有些人可能喜欢这个解决方案并称赞它的独创性(主要是因为没有回答问题),但在编译器优化方面它可能不是最有效的。
            【解决方案8】:

            效率取决于两种情况下的匹配条件。请按照您的答案here

            【讨论】:

              【解决方案9】:

              可读性和可调试性(甚至是一个词吗?)是相当主观的,但有些人(包括我)发现switch 声明更清楚。但是,在许多情况下,与if else 构造相比,编译器使用switch 生成更快代码的机会更大。

              【讨论】:

                【解决方案10】:

                我认为另一种方法是使用预先初始化的地图。它应该将(字符串)数字作为键,将 url 结果作为值。然后你可以简单地做

                url = map.get(Integer.parseInt(url));
                

                这可能是比长 switch 语句更简洁的版本。

                【讨论】:

                  【解决方案11】:

                  switch 比 if else 有更多的功能,因为你可能会遇到 case。

                  详情请见:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

                  class SwitchDemo2 {
                      public static void main(String[] args) {
                  
                          int month = 2;
                          int year = 2000;
                          int numDays = 0;
                  
                          switch (month) {
                              case 1: case 3: case 5:
                              case 7: case 8: case 10:
                              case 12:
                                  numDays = 31;
                                  break;
                              case 4: case 6:
                              case 9: case 11:
                                  numDays = 30;
                                  break;
                              case 2:
                                  if (((year % 4 == 0) && 
                                       !(year % 100 == 0))
                                       || (year % 400 == 0))
                                      numDays = 29;
                                  else
                                      numDays = 28;
                                  break;
                              default:
                                  System.out.println("Invalid month.");
                                  break;
                          }
                          System.out.println("Number of Days = "
                                             + numDays);
                      }
                  }
                  

                  会输出

                  Number of Days = 29
                  

                  所以这也取决于你使用哪一个的实现要求。

                  【讨论】:

                    【解决方案12】:

                    switch 语句更快有以下两个原因。

                    1. switch 语句通常比 if-else-if 构造更快,因为控制直接转移到相应的情况下。而在 if-else-if 的情况下,将执行所有检查以达到第一个匹配条件。例如,如果您分配temp = 6,switch 语句将直接执行相应的块。 if-else-if 结构将遍历所有条件。

                    2. 调用equalsIgnoreCase() 比在大小写匹配的后台执行相等检查的成本更高。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2010-10-20
                      • 2012-06-02
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多