如果vs if-else vs switch,则每个条件都会返回

时间:2012-04-17 04:18:26

标签: java language-agnostic

任何人都能解释在类似以下的大量代码中使用ifif elseswitch之间的权衡(即使它可以忽略不计)吗?如果比较String或另一个Object而不是int,情况会有所不同吗?这些例子都是用Java编写的,但这是一个普遍的问题。

修改

正如几个答案所述,一个开关会更快,如果有多个案例,应该可以使用。但是,在这样的长链中,没有人对if vs if 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;        
}

5 个答案:

答案 0 :(得分:7)

如果您有很多案例,那么switch方法是首选方法。原因是因为前两个基本上需要对所有if语句进行线性搜索。所以你的案件数量是O(N)

另一方面,switch语句的优化方式不同,可以O(log(N))甚至O(1)来查找正确的案例。


编译器如何实现O(log(N))甚至O(1)

  • 二进制搜索案例值将允许在O(log(N))
  • 中完成
  • 如果案例值足够密集,编译器甚至可以使用由case变量索引的跳转表。在这种情况下,它是O(1)

答案 1 :(得分:2)

大多数编译器会将您问题中的示例优化为几乎或甚至完全相同。因此,问题在于可读性。

如果您有一两个案例,if语句通常是有意义的。如果您有很多,特别是如果每​​个案例的代码都很小,那么switch语句在所需代码方面往往更经济,并且更容易阅读。

但是,至少在某一点上,可读性是个人偏好的问题。

答案 2 :(得分:2)

当可以使用时,切换比if / else阻塞更快。如果有超过5个条目,则将其实现为查找。这提供了一些有关性能的信息:Is "else if" faster than "switch() case"?

我相信在这些情况下它也更具可读性。

答案 3 :(得分:1)

对于较少的项目,if语句和switch语句之间不会有显着的性能差异。在switch语句中,每个项目都是同时直接访问的,因此最后一个项目将与第一个项目同时进行。在if语句中访问最后一项将花费比第一项更长的时间,因为它必须遍历它之前的所有项。无论如何,对于更少的项目,延迟将不会显着,如您的示例所示。

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

答案 4 :(得分:0)

如果您有大量类似于提供示例中的条件,那么我会推荐一张地图。

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语句类似。它会降低代码的圈复杂度,使其更具可读性。