if if or switch case

时间:2013-09-06 08:16:55

标签: java

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

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

第一种方式:

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)是不是很糟糕?

12 个答案:

答案 0 :(得分:27)

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

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

答案 1 :(得分:14)

  

请让我知道哪个更有效率。

一个switch语句更有效率

  

使用Integer.parseInt(string)是不是很糟糕?

没有。没关系。但是当你使用java7时,你可以在你的交换机案例中使用String-constants值,但不能在Android上使用。

从效率来看:在大多数情况下,开关看起来更干净。

答案 2 :(得分:4)

在效率方面,请检查:Case vs If Else If: Which is more efficient?,但Way 2看起来更干净,更易读。

答案 3 :(得分:3)

作为一般规则,switch语句会产生更高效的bytecode。使用Java 7时,会引入带String的切换语句,因此您无需进行转换。

答案 4 :(得分:3)

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

事实上,如果您使用的是Java7,则可以直接使用字符串大小写,而不是使用Integer.parseInt()

答案 5 :(得分:2)

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

否则,我认为你可以自己看到这个,开关/案例更容易阅读。

如果你的if结构会有最后的其他情况(包括非数字字符串)

那么你可以做,假设你的整体总是积极的

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

由于以下两个原因,switch语句更快。

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

  2. 调用equalsIgnoreCase()比在案例匹配背景下执行相等检查更为昂贵。

答案 8 :(得分:1)

这么长的列表是一个switch语句肯定是更好的选择。如果在比较中切换开关越好,结点越长

答案 9 :(得分:1)

效率取决于两种情况下的匹配条件。请遵循您的回答here

答案 10 :(得分:1)

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

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

这甚至可能比long switch语句更清晰。

答案 11 :(得分:1)

该开关具有比if else更多的功能,因为您可以通过案例。

详见: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

因此,它还取决于您使用的实施要求。