关于Java:IF else 还是switch

if else or switch case

本问题已经有最佳答案,请猛点这里访问。

我需要检查一小段逻辑,如果有人能给我一些有价值的信息,我会非常感激。

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

第一条道路:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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";
}

第二条道路:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)是否不好?


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

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


Please let me know which is more efficient.

你的情况是,switch语句更有效

Is it bad to use Integer.parseInt(string)?

不,很好。但是,当您使用Java7时,您可以在您的交换机案例中使用字符串常量值,但不能在Android上使用。

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


在效率方面,检查这个:案例与假设:哪一个更有效?但是,方法2看起来是一个更干净和可读的代码。


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

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


一般来说,switch语句产生的bytecode效率更高。使用Java 7时,引入了String的switch语句,因此不需要强制转换它。


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

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

  • 调用equalsIgnoreCase()比执行在案例匹配背景下发生的相等检查要昂贵得多。


  • 可读性和可调试性(这是一个词吗?)比较主观,但有些人(包括我)认为switch的说法更为明确。然而,在许多情况下,编译器使用switch结构生成更快的代码的可能性比if else结构更大。


    使用parseint并不坏,但是如果字符串不是整数,它将抛出异常。

    否则,我想你自己也能看到这个,开关/盒子更容易阅读。

    如果if构造的final else捕获所有其他情况(包括非数字字符串)

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

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

    这个开关比if-else有更多的特性,因为您可能会遇到各种情况。

    有关详细信息,请参阅:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    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);
        }
    }

    意志输出

    1
    Number of Days = 29

    因此,它还取决于您使用的实现需求。


    我认为另一种方法是使用预初始化的映射。它应该以(字符串)数字作为键,以URL结果作为值。那你就可以简单地

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

    这可能是比long switch语句更干净的版本。


    效率取决于两种情况下的匹配条件。请在此确认您的答案。


    对于这样一个长的列表,switch声明无疑是更好的选择。相比之下,如果最好切断一个开关,连接点就越长。