2

I need to check a small piece of logic and would highly appreciate if someone can give me some valuable input.

I have two ways of checking my logic and want to know which is more efficient.

1st way:

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";
}

2nd Way:

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;
}

Please let me know which is more efficient. Is it bad to use Integer.parseInt(string)?

4

12 回答 12

30

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

String[] URLS = {...};
url = URLS[Integer.parseInt(url) - 1];
于 2013-09-06T08:23:13.843 回答
14

请让我知道哪个更有效。

你的情况是 switch 语句更有效

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

不,还好。但是当您使用 java7 时,您可以在 switch 案例中使用字符串常量值,但不能在 Android 上使用。

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

于 2013-09-06T08:19:26.567 回答
4

在效率方面,请检查:Case vs If Else If:哪个更有效?,但方式 2 看起来是一个更干净和可读的代码。

于 2013-09-06T08:19:36.527 回答
3

作为一般规则,该switch语句产生更有效的bytecode. With Java 7, switch 语句 withString被引入,所以你不需要强制转换它。

于 2013-09-06T08:18:39.717 回答
3

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

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

于 2013-09-06T08:22:34.257 回答
2

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

于 2013-09-06T08:27:30.887 回答
2

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

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

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

于 2013-09-06T08:28:55.977 回答
2

使用 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
}
于 2013-09-06T08:23:03.183 回答
1

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

于 2013-09-06T08:26:46.763 回答
1

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

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

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

于 2013-09-06T08:27:32.477 回答
1

switch 比 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

因此,它还取决于您使用哪一个的实现要求。

于 2013-09-06T08:28:30.547 回答
1

对于这么长的列表来说,switch绝对是一个更好的选择。相比之下,如果更好地切断开关,则结点越长

于 2013-09-06T08:20:49.580 回答